ktbjx Posted November 28, 2016 Posted November 28, 2016 i know this is probably very easy for you guys. but could you help me build a lisp to multiple select LINES and change the angle? if angle if angle > 270, we sub - 180 to the angle heres what i got so far... (defun c:anglefix ( / d e f i s spt ept) (if (and (setq s (ssget '((0 . "LINE")))) (repeat (setq i (sslength s)) (setq e (entget (ssname s (setq i (1- i)))) spt (cdr (assoc 10 e)) ept (cdr (assoc 11 e)) ) (princ) i dont know how to use read the angle and change it Quote
Dadgad Posted November 28, 2016 Posted November 28, 2016 What is the difference between adding 180 degrees and subtracting 180 degrees? Aren't they the same thing? Quote
ktbjx Posted November 28, 2016 Author Posted November 28, 2016 What is the difference between adding 180 degrees and subtracting 180 degrees?Aren't they the same thing? 89 + 180 = 269 271 - 180 = 91 it has something to do with the angle when extracted... i need the angle to be BETWEEN 90 and 270 ONLY thus, if angle if angle >270 i sub -180 Quote
Grrr Posted November 28, 2016 Posted November 28, 2016 You want to rotate every line around its center? Do you need to learn from the code? Quote
Grrr Posted November 28, 2016 Posted November 28, 2016 yes! and yes! i do wanna learn Alright: [b][color=BLACK]([/color][/b]defun c:anglefix [b][color=FUCHSIA]([/color][/b] / DTR RTD mid SS i e enx o spt ept cen ang [b][color=FUCHSIA])[/color][/b] [color=#8b4513]; localise the used defuns and set[b][color=FUCHSIA]([/color][/b]ted[b][color=FUCHSIA])[/color][/b] q[b][color=FUCHSIA]([/color][/b]uotes[b][color=FUCHSIA])[/color][/b][/color] [color=#8b4513]; define some functions to help for the task:[/color] [b][color=FUCHSIA]([/color][/b]defun DTR [b][color=NAVY]([/color][/b]a[b][color=NAVY])[/color][/b] [b][color=NAVY]([/color][/b]* PI [b][color=MAROON]([/color][/b]/ a 180[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b][color=#8b4513]; converts degrees to radians[/color] [b][color=FUCHSIA]([/color][/b]defun RTD [b][color=NAVY]([/color][/b]a[b][color=NAVY])[/color][/b] [b][color=NAVY]([/color][/b]/ [b][color=MAROON]([/color][/b]* a 180[b][color=MAROON])[/color][/b] PI[b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b][color=#8b4513]; converts radians to degrees[/color] [b][color=FUCHSIA]([/color][/b]defun mid [b][color=NAVY]([/color][/b]p1 p2[b][color=NAVY])[/color][/b] [b][color=NAVY]([/color][/b]mapcar [b][color=MAROON]([/color][/b]function [b][color=GREEN]([/color][/b]lambda [b][color=BLUE]([/color][/b]a b[b][color=BLUE])[/color][/b] [b][color=BLUE]([/color][/b]/ [b][color=RED]([/color][/b]+ a b[b][color=RED])[/color][/b] 2.[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b] p1 p2[b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b] [color=#8b4513]; finds the midpoint between 2 points[/color] [b][color=FUCHSIA]([/color][/b]if [b][color=NAVY]([/color][/b]setq SS [b][color=MAROON]([/color][/b]ssget '[b][color=GREEN]([/color][/b][b][color=BLUE]([/color][/b]0 . [color=#2f4f4f]"LINE"[/color][b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b] [color=#8b4513]; prompt for a SS of lines, if valid then iterate thru it[/color] [b][color=NAVY]([/color][/b]repeat [b][color=MAROON]([/color][/b]setq i [b][color=GREEN]([/color][/b]sslength SS[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b] [color=#8b4513]; iterate through the selection set[/color] [b][color=MAROON]([/color][/b]setq e [b][color=GREEN]([/color][/b]ssname SS [b][color=BLUE]([/color][/b]setq i [b][color=RED]([/color][/b]1- i[b][color=RED])[/color][/b][b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b] [color=#8b4513]; entity[/color] enx [b][color=GREEN]([/color][/b]entget e[b][color=GREEN])[/color][/b] [color=#8b4513]; entity's data [b][color=GREEN]([/color][/b]elist[b][color=GREEN])[/color][/b][/color] o [b][color=GREEN]([/color][/b]vlax-ename->vla-object e[b][color=GREEN])[/color][/b] [color=#8b4513]; convert the entity into vla-object [b][color=GREEN]([/color][/b]for vla-Rotate[b][color=GREEN])[/color][/b][/color] spt [b][color=GREEN]([/color][/b]cdr [b][color=BLUE]([/color][/b]assoc 10 enx[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b] [color=#8b4513]; start point[/color] ept [b][color=GREEN]([/color][/b]cdr [b][color=BLUE]([/color][/b]assoc 11 enx[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b] [color=#8b4513]; end point [/color] cen [b][color=GREEN]([/color][/b]mid spt ept[b][color=GREEN])[/color][/b] [color=#8b4513]; mid point[/color] ang [b][color=GREEN]([/color][/b]angle spt ept[b][color=GREEN])[/color][/b] [color=#8b4513]; angle of the line [b][color=GREEN]([/color][/b]in radians[b][color=GREEN])[/color][/b][/color] [b][color=MAROON])[/color][/b][color=#8b4513]; setq[/color] [b][color=MAROON]([/color][/b]if [b][color=GREEN]([/color][/b]not [b][color=BLUE]([/color][/b]<= 90 [b][color=RED]([/color][/b]RTD ang[b][color=RED])[/color][/b] 270[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b] [color=#8b4513]; if angle is not between 90 and 270 degrees[/color] [b][color=GREEN]([/color][/b]cond [color=#8b4513]; depending on the angle perform the corresponding action, using [b][color=BLUE]([/color][/b]cond[b][color=BLUE])[/color][/b][/color] [b][color=BLUE]([/color][/b][b][color=RED]([/color][/b]< [b][color=PURPLE]([/color][/b]RTD ang[b][color=PURPLE])[/color][/b] 90[b][color=RED])[/color][/b] [color=#8b4513]; angle is below 90 deg[/color] [b][color=RED]([/color][/b]setq ang [b][color=PURPLE]([/color][/b]+ ang PI[b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b] [color=#8b4513]; add 180 degrees [b][color=RED]([/color][/b]value in radians[b][color=RED])[/color][/b] - this line is redundant, unless you want do do calculations[/color] [b][color=RED]([/color][/b]vla-Rotate o [b][color=PURPLE]([/color][/b]vlax-3D-point cen[b][color=PURPLE])[/color][/b] PI[b][color=RED])[/color][/b] [color=#8b4513]; rotate the line on +180 degrees, from its center[/color] [b][color=BLUE])[/color][/b] [b][color=BLUE]([/color][/b][b][color=RED]([/color][/b]> [b][color=PURPLE]([/color][/b]RTD ang[b][color=PURPLE])[/color][/b] 270[b][color=RED])[/color][/b] [color=#8b4513]; angle is above 270 deg[/color] [b][color=RED]([/color][/b]setq ang [b][color=PURPLE]([/color][/b]- ang PI[b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b] [color=#8b4513]; subtract 180 degrees [b][color=RED]([/color][/b]value in radians[b][color=RED])[/color][/b] - this line is redundant, unless you want do do calculations[/color] [b][color=RED]([/color][/b]vla-Rotate o [b][color=PURPLE]([/color][/b]vlax-3D-point cen[b][color=PURPLE])[/color][/b] [b][color=PURPLE]([/color][/b]- PI[b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b] [color=#8b4513]; rotate the line on -180 degrees, from its center[/color] [b][color=BLUE])[/color][/b] [b][color=GREEN])[/color][/b][color=#8b4513]; cond[/color] [b][color=MAROON])[/color][/b][color=#8b4513]; if[/color] [b][color=NAVY])[/color][/b][color=#8b4513]; repeat[/color] [b][color=FUCHSIA])[/color][/b][color=#8b4513]; if[/color] [b][color=FUCHSIA]([/color][/b]princ[b][color=FUCHSIA])[/color][/b] [color=#8b4513]; exit cleanly[/color] [b][color=BLACK])[/color][/b][color=#8b4513]; defun[/color] [b][color=BLACK]([/color][/b]vl-load-com[b][color=BLACK])[/color][/b] [b][color=BLACK]([/color][/b]princ[b][color=BLACK])[/color][/b] [color=#8b4513]; load the visual lisp extensions[/color] Quote
ktbjx Posted November 28, 2016 Author Posted November 28, 2016 Alright: [b][color=BLACK]([/color][/b]defun c:anglefix [b][color=FUCHSIA]([/color][/b] / DTR RTD mid SS i e enx o spt ept cen ang [b][color=FUCHSIA])[/color][/b] [color=#8b4513]; localise the used defuns and set[b][color=FUCHSIA]([/color][/b]ted[b][color=FUCHSIA])[/color][/b] q[b][color=FUCHSIA]([/color][/b]uotes[b][color=FUCHSIA])[/color][/b][/color] [color=#8b4513]; define some functions to help for the task:[/color] [b][color=FUCHSIA]([/color][/b]defun DTR [b][color=NAVY]([/color][/b]a[b][color=NAVY])[/color][/b] [b][color=NAVY]([/color][/b]* PI [b][color=MAROON]([/color][/b]/ a 180[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b][color=#8b4513]; converts degrees to radians[/color] [b][color=FUCHSIA]([/color][/b]defun RTD [b][color=NAVY]([/color][/b]a[b][color=NAVY])[/color][/b] [b][color=NAVY]([/color][/b]/ [b][color=MAROON]([/color][/b]* a 180[b][color=MAROON])[/color][/b] PI[b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b][color=#8b4513]; converts radians to degrees[/color] [b][color=FUCHSIA]([/color][/b]defun mid [b][color=NAVY]([/color][/b]p1 p2[b][color=NAVY])[/color][/b] [b][color=NAVY]([/color][/b]mapcar [b][color=MAROON]([/color][/b]function [b][color=GREEN]([/color][/b]lambda [b][color=BLUE]([/color][/b]a b[b][color=BLUE])[/color][/b] [b][color=BLUE]([/color][/b]/ [b][color=RED]([/color][/b]+ a b[b][color=RED])[/color][/b] 2.[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b] p1 p2[b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b] [color=#8b4513]; finds the midpoint between 2 points[/color] [b][color=FUCHSIA]([/color][/b]if [b][color=NAVY]([/color][/b]setq SS [b][color=MAROON]([/color][/b]ssget '[b][color=GREEN]([/color][/b][b][color=BLUE]([/color][/b]0 . [color=#2f4f4f]"LINE"[/color][b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b] [color=#8b4513]; prompt for a SS of lines, if valid then iterate thru it[/color] [b][color=NAVY]([/color][/b]repeat [b][color=MAROON]([/color][/b]setq i [b][color=GREEN]([/color][/b]sslength SS[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b] [color=#8b4513]; iterate through the selection set[/color] [b][color=MAROON]([/color][/b]setq e [b][color=GREEN]([/color][/b]ssname SS [b][color=BLUE]([/color][/b]setq i [b][color=RED]([/color][/b]1- i[b][color=RED])[/color][/b][b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b] [color=#8b4513]; entity[/color] enx [b][color=GREEN]([/color][/b]entget e[b][color=GREEN])[/color][/b] [color=#8b4513]; entity's data [b][color=GREEN]([/color][/b]elist[b][color=GREEN])[/color][/b][/color] o [b][color=GREEN]([/color][/b]vlax-ename->vla-object e[b][color=GREEN])[/color][/b] [color=#8b4513]; convert the entity into vla-object [b][color=GREEN]([/color][/b]for vla-Rotate[b][color=GREEN])[/color][/b][/color] spt [b][color=GREEN]([/color][/b]cdr [b][color=BLUE]([/color][/b]assoc 10 enx[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b] [color=#8b4513]; start point[/color] ept [b][color=GREEN]([/color][/b]cdr [b][color=BLUE]([/color][/b]assoc 11 enx[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b] [color=#8b4513]; end point [/color] cen [b][color=GREEN]([/color][/b]mid spt ept[b][color=GREEN])[/color][/b] [color=#8b4513]; mid point[/color] ang [b][color=GREEN]([/color][/b]angle spt ept[b][color=GREEN])[/color][/b] [color=#8b4513]; angle of the line [b][color=GREEN]([/color][/b]in radians[b][color=GREEN])[/color][/b][/color] [b][color=MAROON])[/color][/b][color=#8b4513]; setq[/color] [b][color=MAROON]([/color][/b]if [b][color=GREEN]([/color][/b]not [b][color=BLUE]([/color][/b]<= 90 [b][color=RED]([/color][/b]RTD ang[b][color=RED])[/color][/b] 270[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b] [color=#8b4513]; if angle is not between 90 and 270 degrees[/color] [b][color=GREEN]([/color][/b]cond [color=#8b4513]; depending on the angle perform the corresponding action, using [b][color=BLUE]([/color][/b]cond[b][color=BLUE])[/color][/b][/color] [b][color=BLUE]([/color][/b][b][color=RED]([/color][/b]< [b][color=PURPLE]([/color][/b]RTD ang[b][color=PURPLE])[/color][/b] 90[b][color=RED])[/color][/b] [color=#8b4513]; angle is below 90 deg[/color] [b][color=RED]([/color][/b]setq ang [b][color=PURPLE]([/color][/b]+ ang PI[b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b] [color=#8b4513]; add 180 degrees [b][color=RED]([/color][/b]value in radians[b][color=RED])[/color][/b] - this line is redundant, unless you want do do calculations[/color] [b][color=RED]([/color][/b]vla-Rotate o [b][color=PURPLE]([/color][/b]vlax-3D-point cen[b][color=PURPLE])[/color][/b] PI[b][color=RED])[/color][/b] [color=#8b4513]; rotate the line on +180 degrees, from its center[/color] [b][color=BLUE])[/color][/b] [b][color=BLUE]([/color][/b][b][color=RED]([/color][/b]> [b][color=PURPLE]([/color][/b]RTD ang[b][color=PURPLE])[/color][/b] 270[b][color=RED])[/color][/b] [color=#8b4513]; angle is above 270 deg[/color] [b][color=RED]([/color][/b]setq ang [b][color=PURPLE]([/color][/b]- ang PI[b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b] [color=#8b4513]; subtract 180 degrees [b][color=RED]([/color][/b]value in radians[b][color=RED])[/color][/b] - this line is redundant, unless you want do do calculations[/color] [b][color=RED]([/color][/b]vla-Rotate o [b][color=PURPLE]([/color][/b]vlax-3D-point cen[b][color=PURPLE])[/color][/b] [b][color=PURPLE]([/color][/b]- PI[b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b] [color=#8b4513]; rotate the line on -180 degrees, from its center[/color] [b][color=BLUE])[/color][/b] [b][color=GREEN])[/color][/b][color=#8b4513]; cond[/color] [b][color=MAROON])[/color][/b][color=#8b4513]; if[/color] [b][color=NAVY])[/color][/b][color=#8b4513]; repeat[/color] [b][color=FUCHSIA])[/color][/b][color=#8b4513]; if[/color] [b][color=FUCHSIA]([/color][/b]princ[b][color=FUCHSIA])[/color][/b] [color=#8b4513]; exit cleanly[/color] [b][color=BLACK])[/color][/b][color=#8b4513]; defun[/color] [b][color=BLACK]([/color][/b]vl-load-com[b][color=BLACK])[/color][/b] [b][color=BLACK]([/color][/b]princ[b][color=BLACK])[/color][/b] [color=#8b4513]; load the visual lisp extensions[/color] why doesnt it rotates the lines greater that 270?? does it have something to do with this code? (command "aunits" 0 "" "" "angdir" 1 "" "" "angbase" 270 "" "" "insunits" 6 "" "") beause i always set it to meters and due North for the Direction Quote
Grrr Posted November 28, 2016 Posted November 28, 2016 why doesnt it rotates the lines greater that 270?? does it have something to do with this code? (command "aunits" 0 "" "" "angdir" 1 "" "" "angbase" 270 "" "" "insunits" 6 "" "") beause i always set it to meters and due North for the Direction Hmm, try with "angdir" 0. 0 Counterclockwise1 Clockwise And "angbase" 0. BTW do you use UCS, or work on WCS only ? Quote
ktbjx Posted November 28, 2016 Author Posted November 28, 2016 UCS... i cannot change my angdir and angbase, because all of our DWG file have to be on that setup. Quote
Grrr Posted November 28, 2016 Posted November 28, 2016 UCS...i cannot change my angdir and angbase, because all of our DWG file have to be on that setup. Try this then: [b][color=BLACK]([/color][/b]defun c:anglefix [b][color=FUCHSIA]([/color][/b] / DTR RTD mid *error* Svars SS i e enx o spt ept cen ang [b][color=FUCHSIA])[/color][/b] [color=#8b4513]; localise the used defuns and set[b][color=FUCHSIA]([/color][/b]ted[b][color=FUCHSIA])[/color][/b] q[b][color=FUCHSIA]([/color][/b]uotes[b][color=FUCHSIA])[/color][/b][/color] [color=#8b4513]; define some functions to help for the task:[/color] [b][color=FUCHSIA]([/color][/b]defun DTR [b][color=NAVY]([/color][/b]a[b][color=NAVY])[/color][/b] [b][color=NAVY]([/color][/b]* PI [b][color=MAROON]([/color][/b]/ a 180[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b][color=#8b4513]; converts degrees to radians[/color] [b][color=FUCHSIA]([/color][/b]defun RTD [b][color=NAVY]([/color][/b]a[b][color=NAVY])[/color][/b] [b][color=NAVY]([/color][/b]/ [b][color=MAROON]([/color][/b]* a 180[b][color=MAROON])[/color][/b] PI[b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b][color=#8b4513]; converts radians to degrees[/color] [b][color=FUCHSIA]([/color][/b]defun mid [b][color=NAVY]([/color][/b]p1 p2[b][color=NAVY])[/color][/b] [b][color=NAVY]([/color][/b]mapcar [b][color=MAROON]([/color][/b]function [b][color=GREEN]([/color][/b]lambda [b][color=BLUE]([/color][/b]a b[b][color=BLUE])[/color][/b] [b][color=BLUE]([/color][/b]/ [b][color=RED]([/color][/b]+ a b[b][color=RED])[/color][/b] 2.[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b] p1 p2[b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b] [color=#8b4513]; finds the midpoint between 2 points[/color] [b][color=FUCHSIA]([/color][/b]defun *error* [b][color=NAVY]([/color][/b]m[b][color=NAVY])[/color][/b] [b][color=NAVY]([/color][/b]and Svars [b][color=MAROON]([/color][/b]mapcar 'setvar [b][color=GREEN]([/color][/b]mapcar 'car Svars[b][color=GREEN])[/color][/b] [b][color=GREEN]([/color][/b]mapcar 'cdr Svars[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b] [color=#8b4513]; Restore the system variables[/color] [b][color=NAVY]([/color][/b]and m [b][color=MAROON]([/color][/b]print m[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b] [b][color=NAVY]([/color][/b]princ[b][color=NAVY])[/color][/b] [b][color=FUCHSIA])[/color][/b][color=#8b4513]; defun *error*[/color] [b][color=FUCHSIA]([/color][/b]setq Svars [color=#8b4513]; store the system variables into assoc list, where each item is [b][color=NAVY]([/color][/b]<varName> . <varVal>[b][color=NAVY])[/color][/b][/color] [b][color=NAVY]([/color][/b]mapcar '[b][color=MAROON]([/color][/b]lambda [b][color=GREEN]([/color][/b]x[b][color=GREEN])[/color][/b] [b][color=GREEN]([/color][/b]cons x [b][color=BLUE]([/color][/b]getvar x[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b] '[b][color=MAROON]([/color][/b][color=#2f4f4f]"AUNITS"[/color] [color=#2f4f4f]"ANGDIR"[/color] [color=#2f4f4f]"ANGBASE"[/color][b][color=MAROON])[/color][/b] [b][color=NAVY])[/color][/b] [b][color=FUCHSIA])[/color][/b][color=#8b4513]; setq Svars [/color] [b][color=FUCHSIA]([/color][/b]and Svars [b][color=NAVY]([/color][/b]mapcar 'setvar [b][color=MAROON]([/color][/b]mapcar 'car Svars[b][color=MAROON])[/color][/b] '[b][color=MAROON]([/color][/b]0 0 0[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b] [color=#8b4513]; set new values for the variables[/color] [b][color=FUCHSIA]([/color][/b]if [b][color=NAVY]([/color][/b]setq SS [b][color=MAROON]([/color][/b]ssget '[b][color=GREEN]([/color][/b][b][color=BLUE]([/color][/b]0 . [color=#2f4f4f]"LINE"[/color][b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b] [color=#8b4513]; prompt for a SS of lines, if valid then iterate thru it[/color] [b][color=NAVY]([/color][/b]repeat [b][color=MAROON]([/color][/b]setq i [b][color=GREEN]([/color][/b]sslength SS[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b] [color=#8b4513]; iterate through the selection set[/color] [b][color=MAROON]([/color][/b]setq e [b][color=GREEN]([/color][/b]ssname SS [b][color=BLUE]([/color][/b]setq i [b][color=RED]([/color][/b]1- i[b][color=RED])[/color][/b][b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b] [color=#8b4513]; entity[/color] enx [b][color=GREEN]([/color][/b]entget e[b][color=GREEN])[/color][/b] [color=#8b4513]; entity's data [b][color=GREEN]([/color][/b]elist[b][color=GREEN])[/color][/b][/color] o [b][color=GREEN]([/color][/b]vlax-ename->vla-object e[b][color=GREEN])[/color][/b] [color=#8b4513]; convert the entity into vla-object [b][color=GREEN]([/color][/b]for vla-Rotate[b][color=GREEN])[/color][/b][/color] spt [b][color=GREEN]([/color][/b]trans [b][color=BLUE]([/color][/b]cdr [b][color=RED]([/color][/b]assoc 10 enx[b][color=RED])[/color][/b][b][color=BLUE])[/color][/b] 1 0[b][color=GREEN])[/color][/b] [color=#8b4513]; start point, coordinate translated from WCS to UCS[/color] ept [b][color=GREEN]([/color][/b]trans [b][color=BLUE]([/color][/b]cdr [b][color=RED]([/color][/b]assoc 11 enx[b][color=RED])[/color][/b][b][color=BLUE])[/color][/b] 1 0[b][color=GREEN])[/color][/b] [color=#8b4513]; end point, coordinate translated from WCS to UCS[/color] cen [b][color=GREEN]([/color][/b]mid spt ept[b][color=GREEN])[/color][/b] [color=#8b4513]; mid point[/color] ang [b][color=GREEN]([/color][/b]angle spt ept[b][color=GREEN])[/color][/b] [color=#8b4513]; angle of the line [b][color=GREEN]([/color][/b]in radians[b][color=GREEN])[/color][/b][/color] [b][color=MAROON])[/color][/b][color=#8b4513]; setq[/color] [b][color=MAROON]([/color][/b]if [b][color=GREEN]([/color][/b]not [b][color=BLUE]([/color][/b]<= 90 [b][color=RED]([/color][/b]RTD ang[b][color=RED])[/color][/b] 270[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b] [color=#8b4513]; if angle is not between 90 and 270 degrees[/color] [b][color=GREEN]([/color][/b]cond [color=#8b4513]; depending on the angle perform the corresponding action, using [b][color=BLUE]([/color][/b]cond[b][color=BLUE])[/color][/b][/color] [b][color=BLUE]([/color][/b][b][color=RED]([/color][/b]< [b][color=PURPLE]([/color][/b]RTD ang[b][color=PURPLE])[/color][/b] 90[b][color=RED])[/color][/b] [color=#8b4513]; angle is below 90 deg[/color] [b][color=RED]([/color][/b]setq ang [b][color=PURPLE]([/color][/b]+ ang PI[b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b] [color=#8b4513]; add 180 degrees [b][color=RED]([/color][/b]value in radians[b][color=RED])[/color][/b] - this line is redundant, unless you want do do calculations[/color] [b][color=RED]([/color][/b]vla-Rotate o [b][color=PURPLE]([/color][/b]vlax-3D-point cen[b][color=PURPLE])[/color][/b] PI[b][color=RED])[/color][/b] [color=#8b4513]; rotate the line on +180 degrees, from its center[/color] [b][color=BLUE])[/color][/b] [b][color=BLUE]([/color][/b][b][color=RED]([/color][/b]> [b][color=PURPLE]([/color][/b]RTD ang[b][color=PURPLE])[/color][/b] 270[b][color=RED])[/color][/b] [color=#8b4513]; angle is above 270 deg[/color] [b][color=RED]([/color][/b]setq ang [b][color=PURPLE]([/color][/b]- ang PI[b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b] [color=#8b4513]; subtract 180 degrees [b][color=RED]([/color][/b]value in radians[b][color=RED])[/color][/b] - this line is redundant, unless you want do do calculations[/color] [b][color=RED]([/color][/b]vla-Rotate o [b][color=PURPLE]([/color][/b]vlax-3D-point cen[b][color=PURPLE])[/color][/b] [b][color=PURPLE]([/color][/b]- PI[b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b] [color=#8b4513]; rotate the line on -180 degrees, from its center[/color] [b][color=BLUE])[/color][/b] [b][color=GREEN])[/color][/b][color=#8b4513]; cond[/color] [b][color=MAROON])[/color][/b][color=#8b4513]; if[/color] [b][color=NAVY])[/color][/b][color=#8b4513]; repeat[/color] [b][color=FUCHSIA])[/color][/b][color=#8b4513]; if[/color] [b][color=FUCHSIA]([/color][/b]and Svars [b][color=NAVY]([/color][/b]mapcar 'setvar [b][color=MAROON]([/color][/b]mapcar 'car Svars[b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b]mapcar 'cdr Svars[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b] [color=#8b4513]; Restore the system variables[/color] [b][color=FUCHSIA]([/color][/b]princ[b][color=FUCHSIA])[/color][/b] [color=#8b4513]; exit cleanly[/color] [b][color=BLACK])[/color][/b][color=#8b4513]; defun[/color] [b][color=BLACK]([/color][/b]vl-load-com[b][color=BLACK])[/color][/b] [b][color=BLACK]([/color][/b]princ[b][color=BLACK])[/color][/b] [color=#8b4513]; load the visual lisp extensions[/color] I don't use often trans, so I might be confused and if the code doesn't behave as expected you might need to switch the values like (trans .... 0 1) instead of the current (trans .... 1 0). Quote
jammie Posted November 28, 2016 Posted November 28, 2016 Not heavily tested but an alternative approach (defun c:anglefix (/ object lineAngle tmpPoint) (setq object (vlax-ename->vla-object (car (entsel)))) (setq lineAngle (angle (vlax-curve-getFirstDeriv object 0.0) '(0 0 0) ) ) (if (and (> lineAngle (* pi 0.5)) (< lineAngle (* pi 1.5)) ) (progn (setq tmpPoint (vla-get-StartPoint object)) (vla-put-StartPoint object (vla-get-EndPoint object)) (vla-put-EndPoint object tmpPoint) ) ) ) Quote
Lee Mac Posted November 28, 2016 Posted November 28, 2016 I would suggest the following: ([color=BLUE]defun[/color] c:fliplines ( [color=BLUE]/[/color] ang i p q s x ) ([color=BLUE]setq[/color] ang ([color=BLUE]eval[/color] ([color=BLUE]list[/color] '[color=BLUE]lambda[/color] '( a b ) ([color=BLUE]list[/color] '[color=BLUE]rem[/color] ([color=BLUE]list[/color] '[color=BLUE]+[/color] [color=BLUE]pi[/color] [color=BLUE]pi[/color] ([color=BLUE]list[/color] ([color=BLUE]if[/color] ([color=BLUE]zerop[/color] ([color=BLUE]getvar[/color] 'angdir)) '[color=BLUE]+[/color] '[color=BLUE]-[/color]) ([color=BLUE]list[/color] '[color=BLUE]-[/color] '([color=BLUE]angle[/color] a b) ([color=BLUE]getvar[/color] 'angbase)) ) ) ([color=BLUE]+[/color] [color=BLUE]pi[/color] [color=BLUE]pi[/color]) ) ) ) ) ([color=BLUE]if[/color] ([color=BLUE]setq[/color] s ([color=BLUE]ssget[/color] [color=MAROON]"_X"[/color] '((0 . [color=MAROON]"LINE"[/color])))) ([color=BLUE]repeat[/color] ([color=BLUE]setq[/color] i ([color=BLUE]sslength[/color] s)) ([color=BLUE]setq[/color] x ([color=BLUE]entget[/color] ([color=BLUE]ssname[/color] s ([color=BLUE]setq[/color] i ([color=BLUE]1-[/color] i)))) p ([color=BLUE]assoc[/color] 10 x) q ([color=BLUE]assoc[/color] 11 x) ) ([color=BLUE]if[/color] ([color=BLUE]<[/color] 0 ([color=BLUE]cos[/color] (ang ([color=BLUE]trans[/color] ([color=BLUE]cdr[/color] p) 0 1) ([color=BLUE]trans[/color] ([color=BLUE]cdr[/color] q) 0 1)))) ([color=BLUE]entmod[/color] ([color=BLUE]subst[/color] ([color=BLUE]cons[/color] 11 ([color=BLUE]cdr[/color] p)) p ([color=BLUE]subst[/color] ([color=BLUE]cons[/color] 10 ([color=BLUE]cdr[/color] q)) q x))) ) ) ) ([color=BLUE]princ[/color]) ) Quote
ktbjx Posted November 29, 2016 Author Posted November 29, 2016 I would suggest the following: ([color=BLUE]defun[/color] c:fliplines ( [color=BLUE]/[/color] ang i p q s x ) ([color=BLUE]setq[/color] ang ([color=BLUE]eval[/color] ([color=BLUE]list[/color] '[color=BLUE]lambda[/color] '( a b ) ([color=BLUE]list[/color] '[color=BLUE]rem[/color] ([color=BLUE]list[/color] '[color=BLUE]+[/color] [color=BLUE]pi[/color] [color=BLUE]pi[/color] ([color=BLUE]list[/color] ([color=BLUE]if[/color] ([color=BLUE]zerop[/color] ([color=BLUE]getvar[/color] 'angdir)) '[color=BLUE]+[/color] '[color=BLUE]-[/color]) ([color=BLUE]list[/color] '[color=BLUE]-[/color] '([color=BLUE]angle[/color] a b) ([color=BLUE]getvar[/color] 'angbase)) ) ) ([color=BLUE]+[/color] [color=BLUE]pi[/color] [color=BLUE]pi[/color]) ) ) ) ) ([color=BLUE]if[/color] ([color=BLUE]setq[/color] s ([color=BLUE]ssget[/color] [color=MAROON]"_X"[/color] '((0 . [color=MAROON]"LINE"[/color])))) ([color=BLUE]repeat[/color] ([color=BLUE]setq[/color] i ([color=BLUE]sslength[/color] s)) ([color=BLUE]setq[/color] x ([color=BLUE]entget[/color] ([color=BLUE]ssname[/color] s ([color=BLUE]setq[/color] i ([color=BLUE]1-[/color] i)))) p ([color=BLUE]assoc[/color] 10 x) q ([color=BLUE]assoc[/color] 11 x) ) ([color=BLUE]if[/color] ([color=BLUE]<[/color] 0 ([color=BLUE]cos[/color] (ang ([color=BLUE]trans[/color] ([color=BLUE]cdr[/color] p) 0 1) ([color=BLUE]trans[/color] ([color=BLUE]cdr[/color] q) 0 1)))) ([color=BLUE]entmod[/color] ([color=BLUE]subst[/color] ([color=BLUE]cons[/color] 11 ([color=BLUE]cdr[/color] p)) p ([color=BLUE]subst[/color] ([color=BLUE]cons[/color] 10 ([color=BLUE]cdr[/color] q)) q x))) ) ) ) ([color=BLUE]princ[/color]) ) Thank you sir LEE! and thank you to sir Grrr! thank you for teaching me some Quote
Grrr Posted November 29, 2016 Posted November 29, 2016 I would suggest the following: Atleast now I know it had to be (trans .... 0 1). Quote
Lee Mac Posted November 29, 2016 Posted November 29, 2016 Thank you sir LEE! You're welcome. Atleast now I know it had to be (trans .... 0 1). Indeed, LINE endpoints are stored relative to WCS and would otherwise be projected to the current UCS plane if not transformed before calculating the angle. Though, I suspect the issue in this particular case was more a result of the OP measuring the angle relative to the local ANGBASE/ANGDIR settings. Quote
ktbjx Posted November 29, 2016 Author Posted November 29, 2016 Though, I suspect the issue in this particular case was more a result of the OP measuring the angle relative to the local ANGBASE/ANGDIR settings. so it does something to do with our setup on angbase and angdir?... good to know! i thought angles read the same lol Quote
Lee Mac Posted November 29, 2016 Posted November 29, 2016 so it does something to do with our setup on angbase and angdir?... good to know! i thought angles read the same lol It depends how you are measuring them - i.e. whether you are measuring the angle clockwise/counterclockwise (ANGDIR) relative to the WCS/UCS X-axis and respecting ANGBASE or not. 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.