POOCRACKIN Posted January 13, 2010 Posted January 13, 2010 HA, FIRST POST., ., I HAVE ONLY BEEN LISPING FOR A MONTH AND A HALF IN MY FREE TIME, BIG WORLD TO DIVE INTO., ,. IN THE LISP I AM WORKING ON, I WANTED TO CREATE A 2-D REPRESENTATION OF A HOLE IN SIDEVIEW DWGS OF STEEL CONN. PLATES. (EX. OF CONN. PLATE: "LINE" "@24 PROBLEM IS, AFTER MUCH THOUGHT AND WORK I CAN GET "HOLES" CONSISTENTLY AT ORTHO ANGLES, BUT NOT AT ALL OTHER ANGLES. I AM AT A LOSS AS TO WHY., , HERES THE CODE, OF COURSE I AM NEW SO., SOLVING THE PROBLEM WOULD BE GREAT, OTHERWISE., ANY "YOU SHOULD HAVE DONE IT THIS WAY" WILL CERTAINLY BE APPRECIATED.. I'M STILL TRYING TO GRASP THE WHOLE "HOW TO" OF IT ALL. I HOPE I GOT THE CODE TAGS RIGHT (DEFUN *ERROR* (MSG) (SETVAR "OSMODE" OSM) (SETVAR "ORTHOMODE" OMD) (SETVAR "POLARMODE" PMD) (SETVAR "CMDECHO" 1) (PRINC MSG) (PRINC ) ) (defun C:HO (/ OMD PMD OSM WTH DFC DTC LSP VOBJ ENDP LINC XSP YSP XEP YEP XDIF RXDIF YDIF RYDIF XPT YPT MIDPT CAN CP1 OFP1 OFP2 XCP YCP POO HPX1 HPX2 HPY1 HPY2 HCH1 HCH2 CCPC HOLE HO2MC HDS1 HDS2 THDS1 THDS2) (VL-LOAD-COM) (SETVAR "CMDECHO" 0 ) (WHILE (NULL (SETQ LIN (CAR (ENTSEL "\nPICK LINE LENGTH TO REFERENCE >:)")))) ) (SETQ OMD (GETVAR "ORTHOMODE") PMD (GETVAR "POLARMODE") OSM (GETVAR "OSMODE") WTH (GETDIST "\nTYPE WIDTH OF HOLE)") DFC (/ WTH 2) DTC (GETDIST "\nTYPE DISTANCE TO CENTER OF HOLE:(") LSP (CDR (ASSOC 10 (ENTGET LIN))) vObj(vlax-ename->vla-object LIN) ENDP(vlax-safearray->list (vlax-variant-value (vla-get-endpoint VOBJ))) LINC(CDR(ASSOC 10 (ENTGET LIN))) XSP (CAR LINC) YSP (CADR LINC) XEP (CAR ENDP) YEP (CADR ENDP) ) (IF (> XEP XSP)(SETQ XDIF (- XEP XSP))(SETQ XDIF (- XSP XEP))) (SETQ RXDIF (/ (ABS XDIF) 2)) (IF (> YEP YSP)(SETQ YDIF (- YEP YSP))(SETQ YDIF (- YSP YEP))) (SETQ RYDIF (/ (ABS YDIF) 2) ) (COND ((<= XSP XEP)(SETQ XPT (+ XSP RXDIF))) ((< XEP XSP)(SETQ XPT (+ XEP RXDIF))) ) (COND ((<= YSP YEP)(SETQ YPT (+ YSP RYDIF))) ((< YEP YSP)(SETQ YPT (+ YEP RYDIF))) ) (SETQ MIDPT(LIST XPT YPT) ) (SETVAR "OSMODE" 0) (SETVAR "POLARMODE" 2 ) (SETQ CAN (GETORIENT "\nDIRECTION FROM SELECTED LINE" LSP) CP1 (POLAR MIDPT CAN DTC) OFP2(POLAR MIDPT CAN (+ DTC DFC)) OFP1(POLAR MIDPT CAN (- DTC DFC)) XCP (CAR CP1) YCP (CADR CP1) POO 0.09876 HPX1 (+ XCP POO) HPX2 (- XCP POO) HPY1 (+ YCP POO) HPY2 (- YCP POO) HCH1 (LIST HPX1 HPY1) HCH2 (LIST HPX2 HPY2) ) (COMMAND "ROTATE" EVER "" LINC "REFERENCE" LINC ENDP ANGSP) (COMMAND "MOVE" LIN "" MIDPT CP1) (COMMAND "COPY" LIN "" CP1 MIDPT) (COMMAND "OFFSET" DFC LIN OFP1 "E") (COMMAND "OFFSET" DFC LIN OFP2 "E") (COMMAND "SCALE" LIN "" CP1 "1.5") (COMMAND "-HATCH" "P" "SOLID" HCH1 HCH2 "" ) (SETQ CCPC (LIST (LIST (CAR OFP1)(CADR OFP1))(LIST (CAR OFP2)(CADR OFP2))(LIST XCP YCP)) HOLE (SSGET "_CP" CCPC) HDS1 (GETDIST "n\DIST TO NEXT HOLE") HO2MC(POLAR CP1 CAN HDS1) ) (COMMAND "COPY" HOLE "" CP1 HO2MC) ;;---CONDENSE--CONDENSE--CONDENSE--CONDENSE (SETQ HDS2 (GETDIST "n\DIST TO NEXT HOLE") THDS1(+ HDS1 HDS2) HO2MC (POLAR CP1 CAN THDS1) ) (COMMAND "COPY" HOLE "" CP1 HO2MC ) (SETQ HDS1 (GETDIST "n\DIST TO NEXT HOLE") THDS2(+ HDS1 THDS1) HO2MC(POLAR CP1 CAN THDS2) ) (COMMAND "COPY" HOLE "" CP1 HO2MC ) (SETQ HDS1 (GETDIST "n\DIST TO NEXT HOLE") THDS1(+ HDS1 THDS2) HO2MC(POLAR CP1 CAN THDS1) ) (COMMAND "COPY" HOLE "" CP1 HO2MC ) (SETQ HDS1 (GETDIST "n\DIST TO NEXT HOLE") THDS2(+ HDS1 THDS1) HO2MC(POLAR CP1 CAN THDS2) ) (COMMAND "COPY" HOLE "" CP1 HO2MC ) (SETQ HDS1 (GETDIST "n\DIST TO NEXT HOLE") THDS1(+ HDS1 THDS2) HO2MC(POLAR CP1 CAN THDS1) ) (COMMAND "COPY" HOLE "" CP1 HO2MC ) (SETQ HDS1 (GETDIST "n\DIST TO NEXT HOLE") THDS2(+ HDS1 THDS1) HO2MC(POLAR CP1 CAN THDS2) ) (COMMAND "COPY" HOLE "" CP1 HO2MC ) (SETQ HDS1 (GETDIST "n\DIST TO NEXT HOLE") THDS1(+ HDS1 THDS2) HO2MC(POLAR CP1 CAN THDS1) ) (COMMAND "COPY" HOLE "" CP1 HO2MC ) (SETQ HDS1 (GETDIST "n\DIST TO NEXT HOLE") THDS2(+ HDS1 THDS1) HO2MC(POLAR CP1 CAN THDS2) ) (COMMAND "COPY" HOLE "" CP1 HO2MC ) (SETVAR "POLARMODE" PMD) (SETVAR "OSMODE" OSM) (PRINC) ) Quote
ollie Posted January 14, 2010 Posted January 14, 2010 Shh. No need to shout I think you are looking for the polar command ;convert ENDP point to 3d point (list) (setq p1 (list (car ENDP)(cadr ENDP) 0.0)) ;create new point at distance (real number) ;at angle (radians) (setq p2(polar p1(* 180 (/ radians pi)) distance)) where you are using vlax-safearray->list you could use (setq ENDP (cdr (assoc 11 LIN)))) Not sure if that is what you are after. I would recommend using meaningful variable names for example: ENDP - endPoint Just as useful, proper case function names for example GETPOINT - GetPoint (or java convention getPoint) EDIT: variable name POO, c'mon wtf Hope this helps Ollie Quote
POOCRACKIN Posted January 18, 2010 Author Posted January 18, 2010 sorry so long on the reply, i'm trying to annotate the code to better show what i'm doing, rename variables, eliminate any unused variables and whatnot while at work god bless the system, ., ., but i will repost soon, hopefully today,., ., ., thank you for the safearray work around., ., i'm still working on the polar issue,,, i added the z coord and there's still issues, i think i changed something else unknowingly, so i'm going back through. btw, poo is just a random small number, but small is all relative to the dwg, ha., Point Origin Offset if you will Quote
flowerrobot Posted January 19, 2010 Posted January 19, 2010 EDIT: variable name POO, c'mon wtf Guessing you have never seen my test code before and admin changes it Its amazing some of the random variables a 21 y.o. male instantly come up with Flower (p.s. sorry for not being constructive) Quote
POOCRACKIN Posted January 19, 2010 Author Posted January 19, 2010 okey dokey pokey, hopefully i have better explained what i'm going for, in the code for the "PolHole" command, i have used the polar command, and i can only get it to work when going from left to right (0 degrees) on my pc.. i checked the "PolarDirection" (user defined) variable which updates flawlessly to whatever angle i pick, but the line doesn't seem to copy and offset the same way... out of curiousity, i made the code for the "Hole" command., ., same principles, just took out the "polar" command, scaling and hatch.. but i works at all angles..... for my dear life i cannot figure out why the copy and offset are not going to the seemingly defined angle. "PolHole" - only works left to right ;;CREATE HOLE SYMBOL IN STEEL CONNECTION PLATE ;-ERROR HANDLER- (defun *ERROR* (MSG) (setvar "OrthoMode" OrthoSetting) (setvar "PolarMode" PolarSetting) (setvar "CmdEcho" 1) (princ MSG) (princ ) ); -END DEFUN *ERROR* ;====================================================================; ; _______ __l_______________________________ or ; ;select l l88l88l to make l select ; ;this Line-> l l88l88l <-hole w/ centerLine l <-this line; ; l_______l88l88l_________ and_______________l ; ; l hatch thru plate ; ;====================================================================; (Defun C:polhole (/ LineRef OrthoSetting PolarSetting WidthFromCenter DistanceToCenter StartPoint DifferenceX MidPointX MidPointY CopyPointX EndPoint StartPointX StartPointY EndPointX EndPointY DistanceToMidPointX DifferenceY DistanceToMidPointY MidPoint PolarDirection CopyPoint OffsetPoint2 OffsetPoint1 CopyPointY HatchPointOffset HatchPoint1X HatchPoint2X HatchPoint1Y HatchPoint2Y HatchPoint1 HatchPoint2 TotalHoleCopyDistance1 HoleCopyPoint ) (setvar "CmdEcho" 0 ) (while (null (setq LineRef ;line to make hole from (car (entsel "n\Pick Line length to reference>:")))) ) ;end while (setq OrthoSetting (GetVar "OrthoMode") PolarSetting (GetVar "PolarMode") WidthFromCenter (/ (GetDist "\nTYPE WIDTH OF HOLE)") 2) DistanceToCenter(GetDist "\nTYPE DISTANCE TO CENTER OF HOLE:(") StartPoint (cdr (assoc 10 (ENTGET LineRef))) EndPoint (cdr (assoc 11 (ENTGET LineRef))) StartPointX (car StartPoint) StartPointY (cadr StartPoint) EndPointX (car EndPoint) EndPointY (cadr EndPoint) ) ;end setq ;==============================================================; ; begin determine midpoint of LineRef ; ; which is where it will be copied, moved and offset from later; ; (I had trouble working from the startpoint, not sure why, but; ; but working from the midpoint works fine.) ; ;==============================================================; (if (> EndPointX StartPointX) (setq DifferenceX (- EndPointX StartpointX)) (setq DifferenceX (- StartpointX EndPointX))) ; end if (setq DistanceToMidPointX (/ (abs DifferenceX) 2) ) (if (> EndPointY StartPointY) (setq DifferenceY (- EndPointY StartPointY)) (setq DifferenceY (- StartPointY EndPointY))) ;end if (setq DistanceToMidPointY (/ (ABS DifferenceY) 2) ) ;===============================================================; ;this will determine which direction to apply midpoint distances; ;===============================================================; (cond ((<= StartpointX EndPointX)(SETQ MidPointX (+ StartpointX DistanceToMidpointX))) ((< EndPointX StartpointX)(SETQ MidpointX (+ EndPointX DistanceToMidpointX))) ) (cond ((<= StartPointY EndPointY)(SETQ MidPointY (+ StartPointY DistanceToMidpointY))) ((< EndPointY StartPointY)(SETQ MidPointY (+ EndPointY DistanceToMidpointY))) ) (setq MidPoint (LIST MidPointX MidPointY 0.0) ;added z coordinate ) ;end of figuring midpoint (SETVAR "PolarMode" 2 ) (SETQ PolarDirection (* 180 (/ (GETORIENT "DIRECTION FROM SELECTED LineRef" StartPoint) pi)) CopyPoint (polar MidPoint PolarDirection DistanceToCenter) OffsetPoint2 (POLAR MidPoint PolarDirection (+ DistanceToCenter WidthFromCenter)) OffsetPoint1 (POLAR MidPoint PolarDirection (- DistanceToCenter WidthFromCenter)) CopyPointX (CAR CopyPoint) CopyPointY (CADR CopyPoint) HatchPointOffset 0.09876 HatchPoint1X (+ CopyPointX HatchPointOffset) HatchPoint2X (- CopyPointX HatchPointOffset) HatchPoint1Y (+ CopyPointY HatchPointOffset) HatchPoint2Y (- CopyPointY HatchPointOffset) HatchPoint1 (List HatchPoint1X HatchPoint1Y) HatchPoint2 (List HatchPoint2X HatchPoint2Y) ) ;this will create the hole.. hopefully at any angle (COMMAND "MOVE" LineRef "" MidPoint CopyPoint) (COMMAND "COPY" LineRef "" CopyPoint MidPoint) (COMMAND "OFFSET" WidthFromCenter LineRef OffsetPoint1 "E") (COMMAND "OFFSET" WidthFromCenter LineRef OffsetPoint2 "E") (COMMAND "SCALE" LineRef "" CopyPoint "1.5") (COMMAND "-HATCH" "P" "SOLID" HatchPoint1 HatchPoint2 "" ) (SETQ SsPointsForHole (LIST (LIST (CAR OffsetPoint1)(CADR OffsetPoint1)) ;point list for crossong poly (LIST (CAR OffsetPoint2)(CADR OffsetPoint2)) ;at midpoints of all 3 lines (LIST CopyPointX CopyPointY)) ;that make up "Hole" HOLE (SSGET "_CP" SsPointsForHole) HoleCopyDistance1 (GETDIST "n\DIST TO NEXT HOLE") HoleCopyPoint(POLAR CopyPoint PolarDirection HoleCopyDistance1) ) (COMMAND "COPY" HOLE "" CopyPoint HoleCopyPoint) ;==============================================================================; ;---this just repeats until i find a snazzy way of repeating it an unspecified ; ; number of times ; ;==============================================================================; (SETQ HoleDistance2 (GETDIST "n\DIST TO NEXT HOLE") TotalHoleCopyDistance1(+ HoleCopyDistance1 HoleDistance2) HoleCopyPoint (POLAR CopyPoint PolarDirection TotalHoleCopyDistance1) ) (COMMAND "COPY" HOLE "" CopyPoint HoleCopyPoint ) (SETQ HoleCopyDistance1 (GETDIST "n\DIST TO NEXT HOLE") TotalHoleCopyDistance1(+ HoleCopyDistance1 TotalHoleCopyDistance1) HoleCopyPoint(POLAR CopyPoint PolarDirection TotalHoleCopyDistance1) ) (COMMAND "COPY" HOLE "" CopyPoint HoleCopyPoint ) (SETQ HoleCopyDistance1 (GETDIST "n\DIST TO NEXT HOLE") TotalHoleCopyDistance1(+ HoleCopyDistance1 TotalHoleCopyDistance1) HoleCopyPoint(POLAR CopyPoint PolarDirection TotalHoleCopyDistance1) ) (COMMAND "COPY" HOLE "" CopyPoint HoleCopyPoint ) (SETQ HoleCopyDistance1 (GETDIST "n\DIST TO NEXT HOLE") TotalHoleCopyDistance1(+ HoleCopyDistance1 TotalHoleCopyDistance1) HoleCopyPoint(POLAR CopyPoint PolarDirection TotalHoleCopyDistance1) ) (COMMAND "COPY" HOLE "" CopyPoint HoleCopyPoint ) (SETQ HoleCopyDistance1 (GETDIST "n\DIST TO NEXT HOLE") TotalHoleCopyDistance1(+ HoleCopyDistance1 TotalHoleCopyDistance1) HoleCopyPoint(POLAR CopyPoint PolarDirection TotalHoleCopyDistance1) ) (COMMAND "COPY" HOLE "" CopyPoint HoleCopyPoint ) (SETQ HoleCopyDistance1 (GETDIST "n\DIST TO NEXT HOLE") TotalHoleCopyDistance1(+ HoleCopyDistance1 TotalHoleCopyDistance1) HoleCopyPoint(POLAR CopyPoint PolarDirection TotalHoleCopyDistance1) ) (COMMAND "COPY" HOLE "" CopyPoint HoleCopyPoint ) (SETQ HoleCopyDistance1 (GETDIST "n\DIST TO NEXT HOLE") TotalHoleCopyDistance1(+ HoleCopyDistance1 TotalHoleCopyDistance1) HoleCopyPoint(POLAR CopyPoint PolarDirection TotalHoleCopyDistance1) ) (COMMAND "COPY" HOLE "" CopyPoint HoleCopyPoint ) (SETQ HoleCopyDistance1 (GETDIST "n\DIST TO NEXT HOLE") TotalHoleCopyDistance1(+ HoleCopyDistance1 TotalHoleCopyDistance1) HoleCopyPoint(POLAR CopyPoint PolarDirection TotalHoleCopyDistance1) ) (COMMAND "COPY" HOLE "" CopyPoint HoleCopyPoint ) (SETVAR "PolarMode" PolarSetting) (SETVAR "OrthoMode" OrthoSetting) (SETVAR "CmdEcho" 1) (PRINC) ) "Hole"- not what i want but works at all angles with about the same variable values.. ;;CREATE HOLE SYMBOL IN STEEL CONNECTION PLATE ;-ERROR HANDLER- (defun *ERROR* (MSG) (setvar "OrthoMode" OrthoSetting) (setvar "PolarMode" PolarSetting) (setvar "CmdEcho" 1) (princ MSG) (princ ) ); -END DEFUN *ERROR* (Defun C:hole (/ LineRef PolarSetting WidthFromCenter DistanceToCenter StartPoint EndPoint StartPointX StartPointY EndPointX EndPointY DifferenceX DistanceToMidPointX DifferenceY DistanceToMidPointY MidPointX MidPointY MidPoint PolarDirection OppPolarDirection HoleSide CopyDist CopyDeg OppCopyDeg Side1 Side2 MoveStr CopyStr1 HoleSide1Str) (setvar "CmdEcho" 0 ) (while (null (setq LineRef (car (entsel "<Pick Line length to reference>:"))));line to make hole from ) ;end while (setq PolarSetting (GetVar "PolarMode") WidthFromCenter (/ (GetDist "\nTYPE WIDTH OF HOLE)") 2) ;hole variables DistanceToCenter (GetDist "\nTYPE DISTANCE TO CENTER OF HOLE:(") StartPoint (cdr (assoc 10 (ENTGET LineRef)));"LineRef" points EndPoint (cdr (assoc 11 (ENTGET LineRef))) StartPointX (car StartPoint) StartPointY (cadr StartPoint) EndPointX (car EndPoint) EndPointY (cadr EndPoint) ) ;end setq (if (> EndPointX StartPointX) ;if "LineRef" moves right from StartPoint (setq DifferenceX (- EndPointX StartpointX)) ;do this... if it moves left (setq DifferenceX (- StartpointX EndPointX)) ;do this ) ;end if (setq DistanceToMidPointX (/ (abs DifferenceX) 2) ;get mid of absolute difference in "x" ) (if (> EndPointY StartPointY) ;if "LineRef" moves up from StartPoint (setq DifferenceY (- EndPointY StartPointY)) ;do this... if it moves down (setq DifferenceY (- StartPointY EndPointY)) ;do this ) ;end if (setq DistanceToMidPointY (/ (ABS DifferenceY) 2) ;get mid of absolute difference in "y" ) ;this will determine which direction to apply midpoint distances (cond ((<= StartpointX EndPointX)(SETQ MidPointX (+ StartpointX DistanceToMidpointX))) ((< EndPointX StartpointX)(SETQ MidpointX (+ EndPointX DistanceToMidpointX))) ) (cond ((<= StartPointY EndPointY)(SETQ MidPointY (+ StartPointY DistanceToMidpointY))) ((< EndPointY StartPointY)(SETQ MidPointY (+ EndPointY DistanceToMidpointY))) ) (setq MidPoint (LIST MidPointX MidPointY 0.0) );-------------------------------------------end of figuring midpoint (SETVAR "PolarMode" 2 ;polar on to determine direction to make hole ) ;=================================================================================; ;here is a work around for my faulty polar section of my first code, i have ; ;left out the hatching, and the scaling of the centerline in this code. this is ; ;to show an idea of what i would like the "polar" command to do in the first code ; ;which is to create the "holes" at any angles my little heart desires. ; ;=================================================================================; (setq PolarDirection(* 180(/ (GETORIENT "DIRECTION FROM SELECTED Line" StartPoint) pi)) OppPolarDirection (- PolarDirection 180) HoleSide (RtoS WidthFromCenter 2) CopyDist (RtoS DistanceToCenter 2) OppCopyDeg(RtoS OppPolarDirection 2) CopyDeg (RtoS PolarDirection 2) Side1 (RtoS HoleSide1 2) Side2 (RtoS HoleSide1 2) MoveStr (StrCat "@" copydist "<" CopyDeg) CopyStr1 (StrCat "@" copydist "<" OppCopyDeg) HoleSide1Str (StrCat "@" HoleSide "<" CopyDeg) HoleSide2Str (StrCat "@" HoleSide "<" OppCopyDeg) ) (command "move" LineRef "" MidPoint movestr) (command "copy" LineRef "" MidPoint copystr1) (command "copy" LineRef "" MidPoint HoleSide1Str) (command "copy" LineRef "" MidPoint HoleSide2Str) ;=================================================================================; ;then i would like to scale the middle line to *1.25 and hatch in between the ; ;outer-most lines, then copy or repeat for multiple "hole" instances ; ;=================================================================================; (SETVAR "PolarMode" PolarSetting) ;reset polar (setvar "CmdEcho" 1) );end defun hole two thousand thanks and endless gratitude to anyone who knows what in the infernal hades i have done... yes, i even renamed the "POO" Quote
devitg Posted January 19, 2010 Posted January 19, 2010 Hi POOCRAKIN, my way to debug , while building a lisp , is to let all variable as GLOBAL , just when it run as spected , I localize it. Also I do not use error up I finish the lisp. Other , when doing a division , beware to use a REAL as divisor , so if dividen is a INTeger and divisor is too a INTeger the result will be a INT (/ 5 2) return 2 , (/ 5 2.0) 2.5 . Other tip I use , is to do a setq to each variable. As I do not know WHAT are you trying to do, I can not give you further help. Could it be possible you upload a sample dwg? Gabriel. 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.