mousho Posted June 20, 2022 Posted June 20, 2022 Hi friends i Need help to copy Pline, scale it and draw it in new place if the long line will align with plan X it be great i search the web with no success Quote
Emmanuel Delay Posted June 20, 2022 Posted June 20, 2022 (edited) I based this on somebody's code that combines a copy with align. Link in the code. Command SCS (for Copy Scale) - set scale. - select polyline. (if you want it will permit you to select multiple objects) Then select 3 points (see attached picture) - point 2 is the source base. - point 3 is the base point of the destination. - point 4. that's the end of your long line. It will be set horizontal on the destination. The distance of that long line will be used to calculate the scale of the pasted object. ;; based on c:COPYALIGN ;; https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/combining-copy-amp-align-command/m-p/800575/highlight/true#M26233 ;; ;; Copy SCale (defun c:CSC (/ sc sSet P11 P12 P21 P22 1st 2nd) (setq sc (getreal "\Set scale factor: ")) ;;Combines COPY and ALIGN commands ;;by Jim Smith 2002 (or(member "geom3d.arx" (arx))(arxload "geom3d" nil)) (command "_.undo" "_be") (setq sSet (ssget)) (if sSet (progn (setq P11 (getpoint "Specify first source point: ") P12 (getpoint P11 "\nSpecify first desintation point: ") 1st (cons 256 (list P11 P12)) ) (grvecs 1st) (setq P21 (getpoint "\nSpecify second source point: ") ;; now we calculate P22. P22 is horizontal to the right of P12. ;; how much to the right? distance of P11-P21 X the scale factor ;; (polar pt ang dist) P22 (polar P12 0.0 (* sc (distance P11 P21))) 2nd (cons 256 (list P21 P22)) ) (grvecs 2nd) (command "_.COPY" sSet "" "0,0,0" "@") (align sSet P11 P12 P21 P22 "" "Y") ) ) (setq sSet nil) (grvecs (list P11 P12)) (grvecs (list P21 P22)) (command "_.undo" "_e") (princ) ) Edited June 20, 2022 by Emmanuel Delay 1 Quote
mhupp Posted June 20, 2022 Posted June 20, 2022 Came at it a bit different. used entsel as to limit the selection to one entity (assumes if multiple are selected with ssget they will all have different angles) since limited to one entity selections use while function to allow user to repeat command. like using the copy command with pauses so the user can see the entity moving. like @Steven P did with this. ;;----------------------------------------------------------------------------;; ;; Copy, Scale, & Rotate Entity (defun C:FOO (/ ss pt1 pt2 ang s) (while (setq ent (entsel "\nSelect entity: ")) (setvar 'cmdecho 0) (command "_.Undo" "Be") (setvar 'cmdecho 1) (command ".copy" ent "" pause pause) (setvar 'cmdecho 0) (setq pt1 (getvar 'lastpoint) pt2 (getpoint pt1 "\nHorizontal alignment: ") ang (- (angle pt1 pt2)) ) (command "_.rotate" (entlast) "" pt1 (* (/ ang pi) 180.0)) (setq s (getreal "\nScale Factor: ")) (command "_.scale" (entlast) "" pt1 s) ) (command "_.Undo" "E") (setvar 'cmdecho 1) (princ) ) 1 Quote
tombu Posted June 20, 2022 Posted June 20, 2022 You could also use the MOCORO (Express Tool) command. 1 Quote
mhupp Posted June 20, 2022 Posted June 20, 2022 5 hours ago, tombu said: You could also use the MOCORO (Express Tool) command. unfortunately not in BricsCAD Quote
mousho Posted June 22, 2022 Author Posted June 22, 2022 On 6/20/2022 at 11:59 AM, Emmanuel Delay said: I based this on somebody's code that combines a copy with align. Link in the code. Command SCS (for Copy Scale) - set scale. - select polyline. (if you want it will permit you to select multiple objects) Then select 3 points (see attached picture) - point 2 is the source base. - point 3 is the base point of the destination. - point 4. that's the end of your long line. It will be set horizontal on the destination. The distance of that long line will be used to calculate the scale of the pasted object. ;; based on c:COPYALIGN ;; https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/combining-copy-amp-align-command/m-p/800575/highlight/true#M26233 ;; ;; Copy SCale (defun c:CSC (/ sc sSet P11 P12 P21 P22 1st 2nd) (setq sc (getreal "\Set scale factor: ")) ;;Combines COPY and ALIGN commands ;;by Jim Smith 2002 (or(member "geom3d.arx" (arx))(arxload "geom3d" nil)) (command "_.undo" "_be") (setq sSet (ssget)) (if sSet (progn (setq P11 (getpoint "Specify first source point: ") P12 (getpoint P11 "\nSpecify first desintation point: ") 1st (cons 256 (list P11 P12)) ) (grvecs 1st) (setq P21 (getpoint "\nSpecify second source point: ") ;; now we calculate P22. P22 is horizontal to the right of P12. ;; how much to the right? distance of P11-P21 X the scale factor ;; (polar pt ang dist) P22 (polar P12 0.0 (* sc (distance P11 P21))) 2nd (cons 256 (list P21 P22)) ) (grvecs 2nd) (command "_.COPY" sSet "" "0,0,0" "@") (align sSet P11 P12 P21 P22 "" "Y") ) ) (setq sSet nil) (grvecs (list P11 P12)) (grvecs (list P21 P22)) (command "_.undo" "_e") (princ) ) thx work perfect i did change it a little bit Quote ;; based on c:COPYALIGN ;; https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/combining-copy-amp-align-command/m-p/800575/highlight/true#M26233 ;; ;; Copy SCale ;;Combines COPY and ALIGN commands ;;by Jim Smith 2002 (defun c:CSC ( / d dis i m pm p sc sSet se6e P11 P12 P21 P22 1st 2nd leng ) (or (member "geom3d.arx" (arx)) (arxload "geom3d" nil)) (command "_.undo" "_be") (setq sSet (ssget "+.:E:S" '((0 . "LINE,SPLINE,LWPOLYLINE,POLYLINE,ARC,CIRCLE,ELLIPSE")))) (setq se6e (ssname sSet 0)) (setvar "osmode" 0) (setq i 0 p 0.0 m 0.0 ) (while (setq i (1+ i) d (vlax-curve-getdistatparam se6e i)) (if (< m (setq dis (- d p))) (setq m dis pm (1- i))) (setq p d) ) (setq P11 (vlax-curve-getpointatparam se6e pm) ; Mid Vertex P12 (getpoint P11 "\nSpecify first desintation point: ") ; 1st (cons 256 (list P11 P12)) ) ; (grvecs 1st) (setq P21 (vlax-curve-getpointatparam se6e (1+ pm)) ;; now we calculate P22. P22 is horizontal to the right of P21. ;; how much to the right? distance of P11-P21 X the scale factor ;; (polar pt ang dist) sc (/ 100 dis) P22 (polar P12 0.0 (* sc (distance P11 P21))) ; 2nd (cons 256 (list P21 P22)) ) ; (grvecs 2nd) (command "_.COPY" sSet "" "0,0,0" "@") (align sSet P11 P12 P21 P22 "" "Y") (setq sSet nil) );defun 1 Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.