LISP MOVE circle from polyline to new polyline

LISP MOVE circle from polyline to new polyline

manasi4532
Enthusiast Enthusiast
846 Views
14 Replies
Message 1 of 15

LISP MOVE circle from polyline to new polyline

manasi4532
Enthusiast
Enthusiast

HI all. Is it possible to move the circle from a polyline to a new polyline along its length? I have an example attached.

 

Thank you so much 

0 Likes
Accepted solutions (1)
847 Views
14 Replies
Replies (14)
Message 2 of 15

Moshe-A
Mentor
Mentor

@manasi4532 ,

 

if you name an arc as circle what would you name a real circle?

why can't you just copy the curve?

 

Moshe

 

 

0 Likes
Message 3 of 15

komondormrex
Mentor
Mentor

hi,

check the following. note that the routine can't move a circle with respect to target pline if the distance to root of circle perpendicular falls on a target vertex or falls beyond a target pline length. these will end an execution with error. 

 

 

(defun c:move_circles_primary_target (/ primary_pline circle_list target_pline primary_closest_point_from_center
				        primary_distance_closest_point_from_center primary_point 1st_derivative_primary
				        1st_derivative_primary_angle primary_perpendicular_direction perpendicular_distance
				        target_point 1st_derivative_target 1st_derivative_target_angle 
				     )
	(setq primary_pline (vlax-ename->vla-object (car (entsel "\nPick primary pline: "))))
	(prompt "\nSelect circles to align with target pline: ")
	(setq circle_list (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget '((0 . "circle")))))))
	      target_pline (vlax-ename->vla-object (car (entsel "\nPick target pline: ")))
	)
	(foreach circle circle_list
		(setq primary_closest_point_from_center (vlax-curve-getclosestpointto primary_pline (vlax-get circle 'center))
		      primary_distance_closest_point_from_center (vlax-curve-getdistatpoint primary_pline primary_closest_point_from_center) 
		      primary_point (vlax-curve-getpointatdist primary_pline primary_distance_closest_point_from_center)
		      1st_derivative_primary (vlax-curve-getfirstderiv primary_pline (vlax-curve-getparamatpoint primary_pline primary_point))
		      1st_derivative_primary_angle (angle '(0 0 0) 1st_derivative_primary)
		      primary_perpendicular_direction (- (angle primary_point (vlax-get circle 'center)) 1st_derivative_primary_angle)
		      perpendicular_distance (distance primary_point (vlax-get circle 'center))
		      target_point (vlax-curve-getpointatdist target_pline primary_distance_closest_point_from_center)
		      1st_derivative_target (vlax-curve-getfirstderiv target_pline (vlax-curve-getparamatpoint target_pline target_point))
		      1st_derivative_target_angle (angle '(0 0 0) 1st_derivative_target)
	        )
	  	(vla-move circle (vla-get-center circle)
				 (vlax-3d-point
				  	(polar target_point
					       (+ 1st_derivative_target_angle primary_perpendicular_direction)
					       perpendicular_distance
				        )
				 )
	  	)
	)
)

 

0 Likes
Message 4 of 15

manasi4532
Enthusiast
Enthusiast

My circle name can be anything. I want it to run along the polyline like a prototype.

0 Likes
Message 5 of 15

manasi4532
Enthusiast
Enthusiast

Wow it looks great but when I actually use it The circle ran in the opposite direction of what I wanted. Is it possible for us to choose a starting point for it?

0 Likes
Message 6 of 15

komondormrex
Mentor
Mentor

yep, it moves circles counting from the beginning of primary pline to target pline starting respectfully from the beginning of target pline. do you want to select from what end of target pline counting begins?

maybe simpler solution would be to reverse target pline to suit your needs?

0 Likes
Message 7 of 15

manasi4532
Enthusiast
Enthusiast

I tried reversing the target pline but it still doesn't initialize properly. If I could pick a starting point it would probably go in the right direction.

0 Likes
Message 8 of 15

Kent1Cooper
Consultant
Consultant

@Moshe-A wrote:

if you name an arc as circle what would you name a real circle?

why can't you just copy the curve?


[Zoom in.  There are tiny little Circles close to the Polyline path that they want to Move.]

Kent Cooper, AIA
0 Likes
Message 9 of 15

komondormrex
Mentor
Mentor

Are the plines you are using have only linear segments?

0 Likes
Message 10 of 15

komondormrex
Mentor
Mentor
Accepted solution

check this for all-linear-segments open plines

 

(defun c:move_circles_primary_target (/ primary_pline circle_list target_pline primary_closest_point_from_center
				        				primary_distance_closest_point_from_center primary_point 1st_derivative_primary
				        				1st_derivative_primary_angle primary_perpendicular_direction perpendicular_distance
				        				target_point 1st_derivative_target 1st_derivative_target_angle
								        primary_pline_data target_pline_data 
									vertices_list vertices_list_reversed
				     				 )
	(setq primary_pline (vlax-ename->vla-object (car (setq primary_pline_data (entsel "\nPick primary pline closer to start point demanded: ")))))
	(if (> (vlax-curve-getdistatpoint primary_pline (vlax-curve-getclosestpointto primary_pline (trans (cadr primary_pline_data) 1 0)))  
		   (* 0.5 (vlax-curve-getdistatparam primary_pline (vlax-curve-getendparam primary_pline)))
		)
		(vla-put-coordinates primary_pline 
					 (vlax-safearray-fill 
					 	(vlax-variant-value (vla-get-coordinates primary_pline))
						(progn
						  	(repeat (/ (length (setq vertices_list (vlax-get primary_pline 'coordinates))) 2)
								(setq vertices_list_reversed (append (list (car vertices_list) (cadr vertices_list)) vertices_list_reversed)
									  vertices_list (cddr vertices_list)
								)
							  )
						  	  vertices_list_reversed
						)
					 )
		)
	)
	(prompt "\nSelect circles to align with target pline: ")
	(setq circle_list (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget '((0 . "circle")))))))
	      target_pline (vlax-ename->vla-object (car (setq target_pline_data (entsel "\nPick target pline closer to start demanded: "))))
	      vertices_list_reversed nil
	)
	(if (> (vlax-curve-getdistatpoint target_pline (vlax-curve-getclosestpointto target_pline (trans (cadr target_pline_data) 1 0)))  
		   (* 0.5 (vlax-curve-getdistatparam target_pline (vlax-curve-getendparam target_pline)))
		)
		(vla-put-coordinates target_pline 
					 (vlax-safearray-fill 
					 	(vlax-variant-value (vla-get-coordinates target_pline))
						(progn
							(repeat (/ (length (setq vertices_list (vlax-get target_pline 'coordinates))) 2)
								(setq vertices_list_reversed (append (list (car vertices_list) (cadr vertices_list)) vertices_list_reversed)
									  vertices_list (cddr vertices_list)
								)
							)
							vertices_list_reversed
						)
					 )
		)
	)
	(foreach circle circle_list
		(setq primary_closest_point_from_center (vlax-curve-getclosestpointto primary_pline (vlax-get circle 'center))
		      primary_distance_closest_point_from_center (vlax-curve-getdistatpoint primary_pline primary_closest_point_from_center) 
		      primary_point (vlax-curve-getpointatdist primary_pline primary_distance_closest_point_from_center)
		      1st_derivative_primary (vlax-curve-getfirstderiv primary_pline (vlax-curve-getparamatpoint primary_pline primary_point))
		      1st_derivative_primary_angle (angle '(0 0 0) 1st_derivative_primary)
		      primary_perpendicular_direction (- (angle primary_point (vlax-get circle 'center)) 1st_derivative_primary_angle)
		      perpendicular_distance (distance primary_point (vlax-get circle 'center))
		      target_point (vlax-curve-getpointatdist target_pline primary_distance_closest_point_from_center)
		      1st_derivative_target (vlax-curve-getfirstderiv target_pline (vlax-curve-getparamatpoint target_pline target_point))
		      1st_derivative_target_angle (angle '(0 0 0) 1st_derivative_target)
	        )
	  	(vla-move circle (vla-get-center circle)
				 (vlax-3d-point
				  	(polar target_point
					       (+ 1st_derivative_target_angle primary_perpendicular_direction)
					       perpendicular_distance
				        )
				 )
	  	)
	)
)
Message 11 of 15

manasi4532
Enthusiast
Enthusiast

It works great. No complaints. I appreciate it very much. And thank you for sacrificing your valuable time to help others.😊 😍

0 Likes
Message 12 of 15

Sea-Haven
Mentor
Mentor

Do you mean like this

Fork lift.png

Message 13 of 15

komondormrex
Mentor
Mentor

you are welcome)

Message 14 of 15

manasi4532
Enthusiast
Enthusiast

1686826125675.jpgHello, when I use it on polyline with the components of the arc, why does it revert to its original polyline shape?

0 Likes
Message 15 of 15

komondormrex
Mentor
Mentor

hello, it was supposed that plines  will have only linear segments.

komondormrex_0-1686826333122.png

 

0 Likes