Lee Mac Posted July 6, 2009 Author Posted July 6, 2009 Ok, hopefully now the code will react correctly when Esc is hit Please try the updated code in the first post Lee Quote
MarcoW Posted July 7, 2009 Posted July 7, 2009 Yes the code works perfectly, nothing more to say... Good job! Quote
Lee Mac Posted July 7, 2009 Author Posted July 7, 2009 I have done a major update to the program - version 6 is now in the first post of this thread. I have added the ability to remove items from the block selection set if ET are installed. Also, OSnap now works during the GrRead loops. Enjoy, Lee Quote
JeepMaster Posted July 7, 2009 Posted July 7, 2009 LeeMac, Thanks for continually updating your lisp. Your hard work here on the forum is greatly appreciated. Your lisp works wonderfully...on normal blocks. My only wish is for it to work on dynamic blocks since my work place only use dynamic blocks. For now, I can only dream of using it at work. Quote
Lee Mac Posted July 7, 2009 Author Posted July 7, 2009 LeeMac,Thanks for continually updating your lisp. Your hard work here on the forum is greatly appreciated. Your lisp works wonderfully...on normal blocks. My only wish is for it to work on dynamic blocks since my work place only use dynamic blocks. For now, I can only dream of using it at work. Thanks JeepMaster, tbh I would like it to work on dynamic blocks also, but I have never used them myself, and don't know what I'm doing when it comes to accessing the sub-entites... but glad you like the program Quote
The Buzzard Posted July 7, 2009 Posted July 7, 2009 Thanks JeepMaster,tbh I would like it to work on dynamic blocks also, but I have never used them myself, and don't know what I'm doing when it comes to accessing the sub-entites... but glad you like the program Lee, I am posting this link for your own curiosity. http://mdouglas.blogs.com/in_the_dynamic_interface/2005/07/dynamic_lisp_co.html Below is the code from this link. Dblockcode.lsp Quote
The Buzzard Posted July 7, 2009 Posted July 7, 2009 Lee, I am posting this link for your own curiosity. http://mdouglas.blogs.com/in_the_dynamic_interface/2005/07/dynamic_lisp_co.html Below is the code from this link. Here is another link: http://blog.jtbworld.com/2009/02/mysteries-of-autodesk-caves-dynamic.html Quote
JeepMaster Posted July 7, 2009 Posted July 7, 2009 Here's a simple dynamic receptacle that we use at work with attributes incase you want something to test it with. ACAD-receptacle.dwg Quote
JeepMaster Posted July 10, 2009 Posted July 10, 2009 Just as a future reference incase you want to attack this dynamic beast. This one does multiple attribute on multiple dynamic blocks. ; Lisp to move attributes ; ; Thanks to T.Willey & VovKa - Dec 2007 ; [url]http://www.theswamp.org/index.php?topic=19881.15[/url] (defun SelAtts (Message bAllowText / Sel EntData Pt1 Pt3 gr p1 p2 p3 p4 po ss SelMode SelObjList flag) ; updated by gile @theSwamp.org to show the selection correctly. ; updated by T.Willey to allow the option to select text objects, not mtext ; updated by T.Willey, added new sub to see if the selection box and the bounding box of the objects ; selected cross, so that a true crossing is simulated (defun DoBoxesCross (PtList1 PtList2 / Intersect cnt cnt2) (setq cnt 0) (while (and (not Intersect) (< cnt 4) ) (setq cnt2 0) (repeat 4 (if (inters (nth cnt PtList1) (nth (if (equal cnt 3) 0 (1+ cnt) ) PtList1 ) (nth cnt2 PtList2) (nth (if (equal cnt2 3) 0 (1+ cnt2) ) PtList2 ) T ) (setq Intersect T) ) (setq cnt2 (1+ cnt2)) ) (setq cnt (1+ cnt)) ) Intersect ) ;---------------------------------------------------------------------------------------------------- (defun GetAttSelection (ss SelMode / ObjList PtList TestList ll ur tempPtList SelObjList) (foreach lst (ssnamex ss) (cond ((equal (car lst) 3) (setq ObjList (cons (vlax-ename->vla-object (cadr lst)) ObjList)) ) ((equal (car lst) -1) (foreach sub-lst (cdr lst) (setq PtList (cons (cadr sub-lst) PtList)) ) ) ) ) (foreach obj ObjList (cond ((= (vla-get-ObjectName obj) "AcDbBlockReference") (foreach att (vlax-invoke obj 'GetAttributes) (if (and (/= (vla-get-TextString att) "") (= (vla-get-Invisible att) :vlax-false) ) (progn (setq TestList nil) (vla-GetBoundingBox att 'll 'ur) (setq tempPtList (list (setq ll (safearray-value ll)) (setq ur (safearray-value ur)) (list (car ur) (cadr ll) (caddr ll)) (list (car ll) (cadr ur) (caddr ll)) ) ) (foreach pt tempPtList (if (and (< (caar PtList) (car pt) (caadr PtList)) (< (cadar PtList) (cadr pt) (cadr (caddr PtList))) ) (setq TestList (cons T TestList)) ) ) (if (= SelMode "Windowing") (if (equal (length TestList) 4) (setq SelObjList (cons att SelObjList)) ) (if (or TestList (DoBoxesCross PtList tempPtList) ) (setq SelObjList (cons att SelObjList)) ) ) ) ) ) ) ( (or (= (vla-get-ObjectName obj) "AcDbText") (= (vla-get-ObjectName obj) "AcDbAttributeDefinition") ) (if (or (/= (vla-get-TextString obj) "") (and (vlax-property-available-p obj 'TagString) (/= (vla-get-TagString obj) "") ) ) (progn (setq TestList nil) (vla-GetBoundingBox obj 'll 'ur) (setq tempPtList (list (setq ll (safearray-value ll)) (setq ur (safearray-value ur)) (list (car ur) (cadr ll) (caddr ll)) (list (car ll) (cadr ur) (caddr ll)) ) ) (foreach pt tempPtList (if (and (< (caar PtList) (car pt) (caadr PtList)) (< (cadar PtList) (cadr pt) (cadr (caddr PtList))) ) (setq TestList (cons T TestList)) ) ) (if (= SelMode "Windowing") (if (equal (length TestList) 4) (setq SelObjList (cons obj SelObjList)) ) (if (or TestList (DoBoxesCross PtList tempPtList) ) (setq SelObjList (cons obj SelObjList)) ) ) ) ) ) ) ) SelObjList ) ;---------------------------------------------------------------------------------------------------- (defun gr-sel (/ loop gr pt) (setq loop T) (while (and (setq gr (grread T 12 2)) (/= (car gr) 3) loop) (cond ((= (car gr) 5) (setq pt (cadr gr)) ) ( (or (member gr '((2 13) (2 32))) (or (= (car gr) 11) (= (car gr) 25)) ) (setq loop nil pt nil ) ) ) ) (if pt (cond ((car (nentselp pt))) (pt) ) ) ) ;--------------------------------------------------------------------------------------------------------- (setvar "ErrNo" 0) (while (and (princ (strcat "\n" Message)) (setq sel (gr-sel)) ) (if (listp sel) (progn (setq p1 (list (car sel) (cadr sel)) pt1 (trans p1 1 2) ) (princ "\nSpecify the opposite corner: ") (while (and (setq gr (grread T 12 1)) (/= (car gr) 3)) (if (= 5 (car gr)) (progn (redraw) (setq pt3 (trans (cadr gr) 1 2) p2 (trans (list (car pt3) (cadr pt1)) 2 1) p3 (list (caadr gr) (cadadr gr)) p4 (trans (list (car pt1) (cadr pt3)) 2 1) ) (if (< (car pt1) (car (trans p2 1 2))) (progn (setq SelMode "Windowing") (grvecs (list 255 p1 p2 255 p2 p3 255 p3 p4 255 p4 p1)) ) (progn (setq SelMode "Crossing") (grvecs (list -255 p1 p2 -255 p2 p3 -255 p3 p4 -255 p4 p1) ) ) ) ) ) ) (redraw) (if (if bAllowText (setq ss (ssget "_C" p1 p3 '((0 . "INSERT,TEXT,ATTDEF")))) (setq ss (ssget "_C" p1 p3 '((0 . "INSERT")))) ) (setq SelObjList (append SelObjList (GetAttSelection ss SelMode))) ) ) (progn (setq EntData (entget Sel)) (if (or (= (cdr (assoc 0 EntData)) "ATTRIB") (and bAllowText (vl-position (cdr (assoc 0 EntData)) '("TEXT" "ATTDEF")) ) ) (progn (setq SelObjList (cons (vlax-ename->vla-object Sel) SelObjList) ) (redraw Sel 3) ) ) ) ) (foreach att SelObjList (redraw (vlax-vla-object->ename att) 3) ) ) (foreach att SelObjList (redraw (vlax-vla-object->ename att) 4) ) SelObjList ) ;---------------------------------------------------------------------------------------------------- (defun GetBBPoints (VlaxObj / tmpLL tmpUR LowLeft LowRight UpRight LowRight) ; Get bounding box points for a valid vlax-object ; Returns a list of point lists. (vla-GetBoundingBox VlaxObj 'tmpLL 'tmpUR) (setq LowLeft (safearray-value tmpLL)) (setq UpRight (safearray-value tmpUR)) (setq LowRight (list (car UpRight) (cadr LowLeft) (caddr UpRight))) (setq UpLeft (list (car LowLeft) (cadr UpRight) (caddr LowLeft))) (list LowLeft LowRight UpRight UpLeft) ) ;--------------------------------------------------------------------------------------------------------- (defun c:MoveAttText (/ ActDoc Plss CurSpace ObjList tempPtList PtList tempPline BasePt NewPt *error* LL UR) (defun *error* (msg) (command) (if (> (sslength Plss) 0) (command "_.erase" Plss "") ) (vla-EndUndoMark ActDoc) ) (defun GetCurrentSpace (Doc / BlkCol SpaceList CurSpace ActSpace temp1) ; Returns the "block object" for the active space ; Thanks to Jeff Mishler (if (= (getvar "cvport") 1) (vla-get-PaperSpace Doc) (vla-get-ModelSpace Doc) ) ) (setq ActDoc (vla-get-ActiveDocument (vlax-get-Acad-Object))) (vla-EndUndoMark ActDoc) (vla-StartUndoMark ActDoc) (setq Plss (ssadd)) (setq CurSpace (GetCurrentSpace ActDoc)) (if (setq ObjList (SelAtts "Select attributes and/or text to move: " T)) (foreach obj ObjList (setq tempPtList (GetBBPoints obj)) (setq BasePt (car tempPtList)) (setq PtList nil) (foreach pt tempPtList (setq PtList (cons (car pt) PtList)) (setq PtList (cons (cadr pt) PtList)) ) (setq tempPline (vlax-invoke CurSpace 'AddLightWeightPolyline (reverse PtList) ) ) (vla-put-Closed tempPline :vlax-true) (ssadd (vlax-vla-object->ename tempPline) Plss) ) ) (setq BasePt (apply (function (lambda (p1 p2) (mapcar (function (lambda (e1 e2) (/ (+ e1 e2) 2.))) p1 p2) ) ) ((lambda (Coords) (apply (function (lambda (mn mx) (mapcar (function (lambda (n x) (list n x))) mn mx)) ) (mapcar (function (lambda (c) (list (apply 'min c) (apply 'max c)))) (list (mapcar 'car Coords) (mapcar 'cadr Coords)) ) ) ) (apply 'append (mapcar (function (lambda (Obj) (vla-GetBoundingBox Obj 'LL 'UR) (list (vlax-safearray->list LL) (vlax-safearray->list UR)) ) ) ObjList ) ) ) ) ) (if (> (sslength Plss) 0) (progn (setvar 'cmdecho 1) (command "_.move" Plss "" BasePt pause ) (setq NewPt (getvar 'lastpoint)) (setvar 'cmdecho 0) (command "_.erase" Plss "") (foreach obj ObjList (vlax-invoke obj 'Move (append BasePt (cddr NewPt)) NewPt) ) ) ) (vla-EndUndoMark ActDoc) (princ) ) Quote
Lee Mac Posted July 10, 2009 Author Posted July 10, 2009 Thanks Jeep, but I may have to leave the Dyn Blocks, they are a bit beyond me at the moment to be honest Quote
Zorg Posted August 5, 2009 Posted August 5, 2009 Beautiful, this is gonna save me alot of time when it comes to attribute editing! Quote
tmarjan Posted October 27, 2009 Posted October 27, 2009 Lee, Thanks a lot for a great lisp:) As you said, "what's gonna be next?" I have a continuous problem that might be worth solving. There's a tendency for each CAD user to have its own idea of accuracy. When I get to work on somebody else's files, I usually find myself correcting small inaccuracies that could cause problems in hatches, dimensioning etc. and finally wind up with more time consumed on filleting lines and closing plines than it would take if error really occured, or if I decided to draw it all anew. To cut the long story, does anyone know of a lisp that could, for example, round up all of polyline's vertices into integer values? Or for that matter do the same with lines, or block insert points? If not, there's your chalenge:D Quote
CAB Posted October 27, 2009 Posted October 27, 2009 You'll want to start a new thread for this one. How about posting a DWG with a before & after. Are you using Metric for your units? Quote
DVDM Posted April 14, 2010 Posted April 14, 2010 Hi Lee, I've been using this routine for a while now. First time I saw it I was very impressed, but didn't really know what to do with it. It didn't take long though to find a way to put it to good use on occasion. So far I've only really used the move attribute function. I have a few suggestions for the program. I always work with Polar Tracking turned on, and prefer this a lot over having Ortho Mode turned on. When moving the attributes though, polar tracking no longer works, and need to turn on Ortho Mode to move my attribute 2mm left or right. Another thing that would be really useful for me, is the ability to change text properties of multiple attributes. However, with your EdAtt command I am forced to change the value of the attribute as well, whereas I would like to keep the value as is and just edit the text properties. Of all the available text options it can change, the one thing that's most useful to me is not available; the text width factor. I never need to change angle or rotation, and only sometimes the alignment. If you could find a moment to include width factor that'd be great Last, I noticed that if I select a block that contains an attribute that has no value, it returns an error. I would still like to be able to move/change this attribute though, so that when it does get a value, the text and placement will be the same as all the others. Thanks! Quote
Lee Mac Posted April 14, 2010 Author Posted April 14, 2010 Hi DVDM, Thanks for your continued reviews of my program - they are truly appreciated, its great to hear feedback. I haven't looked at the code for this program in a long time, so there are probably quite a few things that I could code in a better way. The issue is that the program runs on a GrRead loop to create the "dynamic" effect, however this grRead loop completely irradicates all standard AutoCAD functionality, and so everything must be imitated and hard coded into the program. This is difficult enough for imitating ObjectSnap, but for Polar Tracking etc this task becomes almost impossible. To resolve the issue, I could make a version that is not 'dynamic', and hence all AutoCAD functionality is available. I shall look over your other suggestions and see what I can incorporate when I get some spare time. Again, many thanks for your interest, Lee Quote
pule Posted September 30, 2010 Posted September 30, 2010 Hi i have one question, i dont wanna to change or replace block attributes (value) i just wanna use options from "Advanced" button to modify other properties of the Attribute Text like Text Style... Is there any option to do that? Quote
Lee Mac Posted September 30, 2010 Author Posted September 30, 2010 Hi, Here is a concept code that will act akin to AutoCAD's Match Properties [i][color=#990099];;-------------------=={ Match Attribs }==--------------------;;[/color][/i] [i][color=#990099];; ;;[/color][/i] [i][color=#990099];; Prompts for selection of source attribute, then proceeds ;;[/color][/i] [i][color=#990099];; to match the listed properties for subsequently picked ;;[/color][/i] [i][color=#990099];; attributes. ;;[/color][/i] [i][color=#990099];;------------------------------------------------------------;;[/color][/i] [i][color=#990099];; Author: Lee McDonnell, 2010 ;;[/color][/i] [i][color=#990099];; ;;[/color][/i] [i][color=#990099];; Copyright © 2010 by Lee McDonnell, All Rights Reserved. ;;[/color][/i] [i][color=#990099];; Contact: Lee Mac @ TheSwamp.org, CADTutor.net ;;[/color][/i] [i][color=#990099];;------------------------------------------------------------;;[/color][/i] [b][color=RED]([/color][/b][b][color=BLUE]defun[/color][/b] c:MatchAttribs [b][color=RED]([/color][/b] [b][color=BLUE]/[/color][/b] properties source [b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]vl-load-com[/color][/b][b][color=RED])[/color][/b] [i][color=#990099];; © Lee Mac 2010[/color][/i] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] properties [b][color=DARKRED]'[/color][/b][b][color=RED]([/color][/b] Backward Height Layer Linetype LinetypeScale Lineweight ObliqueAngle Rotation ScaleFactor StyleName Thickness UpsideDown [b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]if[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] source [b][color=RED]([/color][/b]LM:Selectif [b][color=RED]([/color][/b][b][color=BLUE]lambda[/color][/b] [b][color=RED]([/color][/b] x [b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]eq[/color][/b] [b][color=#a52a2a]"ATTRIB"[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]cdr[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]assoc[/color][/b] [b][color=#009900]0[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]entget[/color][/b] x[b][color=RED]))))[/color][/b] [b][color=RED])[/color][/b] [b][color=BLUE]nentsel[/color][/b] [b][color=#a52a2a]"\nSelect Source Attribute: "[/color][/b] [b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED]([/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]lambda[/color][/b] [b][color=RED]([/color][/b] properties values [b][color=BLUE]/[/color][/b] dest [b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]while[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] dest [b][color=RED]([/color][/b]LM:Selectif [b][color=RED]([/color][/b][b][color=BLUE]lambda[/color][/b] [b][color=RED]([/color][/b] x [b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]eq[/color][/b] [b][color=#a52a2a]"ATTRIB"[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]cdr[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]assoc[/color][/b] [b][color=#009900]0[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]entget[/color][/b] x[b][color=RED]))))[/color][/b] [b][color=RED])[/color][/b] [b][color=BLUE]nentsel[/color][/b] [b][color=#a52a2a]"\nSelect Destination Attributes: "[/color][/b] [b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] dest [b][color=RED]([/color][/b][b][color=BLUE]vlax-ename->vla-object[/color][/b] dest[b][color=RED]))[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]mapcar[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]function[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]lambda[/color][/b] [b][color=RED]([/color][/b] property value [b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]vlax-put-property[/color][/b] dest property value[b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED])[/color][/b] properties values [b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED])[/color][/b] properties [b][color=RED]([/color][/b][b][color=BLUE]progn[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] source [b][color=RED]([/color][/b][b][color=BLUE]vlax-ename->vla-object[/color][/b] source[b][color=RED]))[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]mapcar[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]function[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]lambda[/color][/b] [b][color=RED]([/color][/b] property [b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]vlax-get-property[/color][/b] source property[b][color=RED]))[/color][/b] [b][color=RED])[/color][/b] properties [b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]princ[/color][/b][b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [i][color=#990099];;---------------------=={ Select if }==----------------------;;[/color][/i] [i][color=#990099];; ;;[/color][/i] [i][color=#990099];; Continuous selection prompts until the predicate function ;;[/color][/i] [i][color=#990099];; foo is validated ;;[/color][/i] [i][color=#990099];;------------------------------------------------------------;;[/color][/i] [i][color=#990099];; Author: Lee McDonnell, 2010 ;;[/color][/i] [i][color=#990099];; ;;[/color][/i] [i][color=#990099];; Copyright © 2010 by Lee McDonnell, All Rights Reserved. ;;[/color][/i] [i][color=#990099];; Contact: Lee Mac @ TheSwamp.org, CADTutor.net ;;[/color][/i] [i][color=#990099];;------------------------------------------------------------;;[/color][/i] [i][color=#990099];; Arguments: ;;[/color][/i] [i][color=#990099];; foo - optional predicate function taking ename argument ;;[/color][/i] [i][color=#990099];; fun - selection function to invoke ;;[/color][/i] [i][color=#990099];; str - prompt string ;;[/color][/i] [i][color=#990099];;------------------------------------------------------------;;[/color][/i] [i][color=#990099];; Returns: selected entity ename if successful, else nil ;;[/color][/i] [i][color=#990099];;------------------------------------------------------------;;[/color][/i] [b][color=RED]([/color][/b][b][color=BLUE]defun[/color][/b] LM:Selectif [b][color=RED]([/color][/b] foo fun str [b][color=BLUE]/[/color][/b] e [b][color=RED])[/color][/b] [i][color=#990099];; © Lee Mac 2010[/color][/i] [b][color=RED]([/color][/b][b][color=BLUE]while[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]progn[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] e [b][color=RED]([/color][/b][b][color=BLUE]car[/color][/b] [b][color=RED]([/color][/b]fun str[b][color=RED])))[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]cond[/color][/b] [b][color=RED]([/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]eq[/color][/b] [b][color=DARKRED]'[/color][/b]ENAME [b][color=RED]([/color][/b][b][color=BLUE]type[/color][/b] e[b][color=RED]))[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]if[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]and[/color][/b] foo [b][color=RED]([/color][/b][b][color=BLUE]not[/color][/b] [b][color=RED]([/color][/b]foo e[b][color=RED])))[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]princ[/color][/b] [b][color=#a52a2a]"\n** Invalid Object Selected **"[/color][/b][b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED])[/color][/b] e [b][color=RED])[/color][/b] Quote
Guiboard Posted September 30, 2010 Posted September 30, 2010 Got one for you Lee, when using your EdAtt function, would that be possible to "Insert field"? Good luck on that one, Guiboard Quote
Lee Mac Posted September 30, 2010 Author Posted September 30, 2010 Got one for you Lee, when using your EdAtt function, would that be possible to "Insert field"? Good luck on that one, Guiboard I would be inclined to use the existing AutoCAD functionality on that one. - The whole program needs a rewrite really.. I just don't have the time. 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.