lisp for Drawing elbow for fastest

lisp for Drawing elbow for fastest

smallƑish
Advocate Advocate
2,857 Views
26 Replies
Message 1 of 27

lisp for Drawing elbow for fastest

smallƑish
Advocate
Advocate

I'm using "RD" lisp to draw all kinds of reducers written by @komondormrex , The fastest program ever (actions 1 & 2 in GIF). Can anyone help me to do the same for my elbow? GIF, Lisp, and DWG are attached for more clarity.

Note : All objects are lines. ( No polyline)

 

vsdc-sr 2023-08-23 20-49-10.gif

 

0 Likes
Accepted solutions (2)
2,858 Views
26 Replies
Replies (26)
Message 21 of 27

smallƑish
Advocate
Advocate

😊

0 Likes
Message 22 of 27

komondormrex
Mentor
Mentor
Accepted solution

check this one. to make an elbow select either way 4 lines.

updated.

 

 

;***************************************************************************************************************************************

;	c:draw_elbow. elbowing tubes have to have same diameter.
;	komondormrex, sep 2023

;***************************************************************************************************************************************

(defun get_angle (point_1 point_2)
	(if (equal 0 (angle point_1 point_2) 1e-6)
		(* 2 pi)
	  	(angle point_1 point_2)
	)
)

;***************************************************************************************************************************************

(defun find_parallel_line (line_list / angle_line_list 1st_pair_list line_parallel)
	(setq angle_line_list (mapcar '(lambda (line) (list (vl-sort (list (get_angle (vlax-get line 'startpoint) (vlax-get line 'endpoint))
									   (get_angle (vlax-get line 'endpoint) (vlax-get line 'startpoint))
								     ) '<
							    ) line
						      )
				       ) line_list
			      )
	      1st_pair_list (car angle_line_list)
	      angle_line_list (cdr angle_line_list)
	)
  	(if (vl-some '(lambda (line) (equal (car 1st_pair_list) (car (setq line_parallel line)) 1e-3)) angle_line_list) 
		(progn
			(setq 1st_pair_list (append (list 1st_pair_list) (list line_parallel))
		  	      angle_line_list (vl-remove line_parallel angle_line_list)
			)
		  	(if (equal (caar angle_line_list) (caadr angle_line_list) 1e-3)
				(list (mapcar 'cadr 1st_pair_list) (mapcar 'cadr angle_line_list)) 
			  	nil
			)
		)
	  	nil
  	)
)

;***************************************************************************************************************************************

(defun line_intersections (line line_list / farthest_end)
  	(setq farthest_end (find_line_fathest_end line (car line_list))) 
  	(append (vl-sort (list (lines_intersect_point line (car line_list))
	     	   	       (lines_intersect_point line (cadr line_list))
	     	         )
		        '(lambda (point_1 point_2) (< (distance farthest_end point_1) (distance farthest_end point_2)))
	        )
	        (list line)
        )
)

;***************************************************************************************************************************************

(defun find_line_fathest_end (line line_1)
	(if (> (distance (vlax-get line 'startpoint) (lines_intersect_point line line_1))
	       (distance (vlax-get line 'endpoint) (lines_intersect_point line line_1))
	    )
	    (vlax-get line 'startpoint)
	    (vlax-get line 'endpoint)
	)
)

;***************************************************************************************************************************************

(defun lines_intersect_point (line_1 line_2)
	(inters (vlax-get line_1 'startpoint)
		(vlax-get line_1 'endpoint)
		(vlax-get line_2 'startpoint)
		(vlax-get line_2 'endpoint)
		nil
	)
)
			 
;***************************************************************************************************************************************

(defun draw_line (point_1 point_2 line_layer)
	(vla-put-layer
		(vla-addline (vla-get-block (vla-get-activelayout (vla-get-activedocument (vlax-get-acad-object))))
							 (vlax-3d-point point_1)
							 (vlax-3d-point point_2)
		)
		line_layer
	)
)

;***************************************************************************************************************************************

(defun c:draw_elbow ( / tube_lines_sset line_list parallel_line_list line_intersections_list line_index point inner_pair outer_pair
		        tube_diameter tube_layer arc_1 arc_2 object_count
		    )
	(vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
  	(if (and (setq tube_lines_sset (ssget '((0 . "line"))))
		 (setq line_list (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex tube_lines_sset)))))
		 (= (length line_list) 4)
		 (setq parallel_line_list (find_parallel_line line_list))
	    )
		(progn
			(setq line_intersections_list
			  	(list (line_intersections (car (car parallel_line_list)) (cadr parallel_line_list))
				      (line_intersections (cadr (car parallel_line_list)) (cadr parallel_line_list))
				      (line_intersections (car (cadr parallel_line_list)) (car parallel_line_list))
				      (line_intersections (cadr (cadr parallel_line_list)) (car parallel_line_list))
				)
			      	tube_diameter (distance (vlax-get (last (car line_intersections_list)) 'startpoint)
							(inters (vlax-get (last (car line_intersections_list)) 'startpoint)
								(polar (vlax-get (last (car line_intersections_list)) 'startpoint)
								       (+ (* 0.5 pi) (vla-get-angle (last (car line_intersections_list))))
								       1
							        )
								(vlax-get (last (cadr line_intersections_list)) 'startpoint)
								(vlax-get (last (cadr line_intersections_list)) 'endpoint)
								nil
							)
					      )
			        tube_layer (vla-get-layer (last (car line_intersections_list))) 
		  		line_index -1
			)
		  	(while (and
				  (setq point (car (nth (setq line_index (1+ line_index)) line_intersections_list))) 
	  			  (/= 2 (length (setq inner_pair (vl-remove nil (mapcar '(lambda (line) (if (equal (car line) point 1e-3) (last line)))
											 line_intersections_list
										)
								 )
						)
				  	)
				  )
			       )
		     	)
		  	(setq line_index -1)
		  	(while (and
				  (setq point (cadr (nth (setq line_index (1+ line_index)) line_intersections_list))) 
	  			  (/= 2 (length (setq outer_pair (vl-remove nil (mapcar '(lambda (line) (if (equal (cadr line) point 1e-3) (last line)))
											 line_intersections_list
									 	)
								 )
						)
					)
				  )
			       )
		     	)
		  	(setvar 'cmdecho 0)
		  	(setvar 'filletrad (* 0.25 tube_diameter))
		  	(command "_fillet" (vlax-vla-object->ename (car inner_pair)) "" (vlax-vla-object->ename (cadr inner_pair)))
		  	(setvar 'filletrad (* 1.25 tube_diameter))
		  	(command "_fillet" (vlax-vla-object->ename (car outer_pair)) "" (vlax-vla-object->ename (cadr outer_pair)))
		  	(setvar 'cmdecho 1)
		  	(setq object_count (vla-get-count (vla-get-block (vla-get-activelayout (vla-get-activedocument (vlax-get-acad-object)))))
		  	      arc_1 (vla-item (vla-get-block (vla-get-activelayout (vla-get-activedocument (vlax-get-acad-object)))) (- object_count 1))
			      arc_2 (vla-item (vla-get-block (vla-get-activelayout (vla-get-activedocument (vlax-get-acad-object)))) (- object_count 2))
			)
		  	(draw_line (vlax-get arc_1 'startpoint) (vlax-get arc_2 'startpoint) tube_layer)
		  	(draw_line (vlax-get arc_1 'endpoint) (vlax-get arc_2 'endpoint) tube_layer)
		)
	  	(princ "\nInvalid selection")
	)
  	(vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
  	(princ)
)

 

 

 

 

 

Message 23 of 27

smallƑish
Advocate
Advocate

As always, your solution here is impeccable. Thank you so much for providing exactly what I had envisioned

0 Likes
Message 24 of 27

smallƑish
Advocate
Advocate
Can you please advise me, How can I contact you personally?
0 Likes
Message 25 of 27

komondormrex
Mentor
Mentor

send me a pm. 

0 Likes
Message 26 of 27

smallƑish
Advocate
Advocate

Already send you.

0 Likes
Message 27 of 27

pewpewx
Participant
Participant

can i have this lisp files? 

0 Likes