Leaderboard
Popular Content
Showing content with the highest reputation since 09/05/2026 in Posts
-
Another way to do it: transform lines, polylines/polyarcs, circles or arcs into mutilines. This way we retain the properties of the chosen multiline style. Arcs are simulated with segments. ;; ListBox (gile) ;; Boite de dialogue permettant un ou plusieurs choix dans une liste ;; ;; Arguments ;; title : le titre de la boite de dialogue (chaîne) ;; msg ; message (chaîne), "" ou nil pour aucun ;; keylab : une liste d'association du type ((key1 . label1) (key2 . label2) ...) ;; flag : 0 = liste déroulante ;; 1 = liste choix unique ;; 2 = liste choix multipes ;; ;; Retour : la clé de l'option (flag = 0 ou 1) ou la liste des clés des options (flag = 2) ;; ;; Exemple d'utilisation ;; (listbox "Présentation" "Choisir une présentation" (mapcar 'cons (layoutlist) (layoutlist)) 1) (defun ListBox (title msg keylab flag / tmp file dcl_id choice) (setq tmp (vl-filename-mktemp "tmp.dcl") file (open tmp "w") ) (write-line (strcat "ListBox:dialog{label=\"" title "\";") file ) (if (and msg (/= msg "")) (write-line (strcat ":text{label=\"" msg "\";}") file) ) (write-line (cond ((= 0 flag) "spacer;:popup_list{key=\"lst\";") ((= 1 flag) "spacer;:list_box{key=\"lst\";") (T "spacer;:list_box{key=\"lst\";multiple_select=true;") ) file ) (write-line "}spacer;ok_button;}" file) (close file) (setq dcl_id (load_dialog tmp)) (if (not (new_dialog "ListBox" dcl_id)) (exit) ) (start_list "lst") (mapcar 'add_list (mapcar 'cdr keylab)) (end_list) (action_tile "accept" "(or (= (get_tile \"lst\") \"\") (if (= 2 flag) (progn (foreach n (str2lst (get_tile \"lst\") \" \") (setq choice (cons (nth (atoi n) (mapcar 'car keylab)) choice)) ) (setq choice (reverse choice)) ) (setq choice (nth (atoi (get_tile \"lst\")) (mapcar 'car keylab))) ) ) (done_dialog)" ) (start_dialog) (unload_dialog dcl_id) (vl-file-delete tmp) choice ) (defun def_bulg_pl (ls lb flag_closed / ls lb rad a l_new) (if (not (zerop flag_closed)) (setq ls (append ls (list (car ls))))) (while (cadr ls) (if (zerop (car lb)) (setq l_new (append l_new (list (car ls)))) (progn (setq rad (/ (distance (car ls) (cadr ls)) (sin (* 2.0 (atan (abs (car lb))))) 2.0) a (- (/ pi 2.0) (- pi (* 2.0 (atan (abs (car lb)))))) ) (if (< a 0.0) (setq a (- (* 2.0 pi) a))) (if (or (and (< (car lb) 0.0) (> (car lb) -1.0)) (> (car lb) 1.0)) (setq l_new (append l_new (reverse (cdr (reverse (bulge_pts (polar (car ls) (- (angle (car ls) (cadr ls)) a) rad) (car ls) (cadr ls) rad (car lb))))))) (setq l_new (append l_new (reverse (cdr (reverse (bulge_pts (polar (car ls) (+ (angle (car ls) (cadr ls)) a) rad) (car ls) (cadr ls) rad (car lb))))))) ) ) ) (setq ls (cdr ls) lb (cdr lb)) ) (append l_new (list (car ls))) ) (defun bulge_pts (pt_cen pt_begin pt_end rad sens / inc ang nm p1 p2 lst) (setq inc (angle pt_cen (if (< sens 0.0) pt_end pt_begin)) ang (+ (* 2.0 pi) (angle pt_cen (if (< sens 0.0) pt_begin pt_end))) nm (fix (/ (rem (- ang inc) (* 2.0 pi)) (/ (* pi 2.0) 36.0))) ) (repeat nm (setq p1 (polar pt_cen inc rad) inc (+ inc (/ (* pi 2.0) 36.0)) lst (append lst (list p1)) ) ) (setq p2 (polar pt_cen ang rad) lst (append lst (list p2)) ) (if (< sens 0.0) (reverse lst) lst) ) (defun c:polyarc2ml ( / jspl nbr l_mlstyl sel_styl ent dxf_ent typent name_layer closed lst l_bulg e_next dxf_next oldlayer oldosm key_mod scale_ml) (princ "\nSelect polylines/lines/circles/arcs for transform to multilines: ") (setq jspl (ssget '((0 . "*POLYLINE,LINE,CIRCLE,ARC") (-4 . "<NOT") (-4 . "&") (70 . 124) (-4 . "NOT>"))) nbr 0 ) (cond (jspl (setq l_mlstyl (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 3)) (dictsearch (namedobjdict) "ACAD_MLINESTYLE") ) ) ) (while (not (setq sel_styl (listbox "Multilines style" "Choose a Multiline style" (mapcar 'cons l_mlstyl l_mlstyl) 1)))) (setvar "cmlstyle" sel_styl) (initget "Top Zero Bottom") (setq key_mod (getkword (strcat "\nGive justification type [Top/Zero/Bottom] <" (cond ((eq (getvar "cmljust") 0) "Top" ) ((eq (getvar "cmljust") 1) "Zero" ) ((eq (getvar "cmljust") 2) "Bottom" ) ) ">: " ) ) ) (if key_mod (cond ((eq key_mod "Top") (setvar "cmljust" 0)) ((eq key_mod "Zero") (setvar "cmljust" 1)) ((eq key_mod "Bottom") (setvar "cmljust" 2)) ) ) (setq scale_ml (getdist (strcat "\nGive scale for multiline <" (rtos (getvar "cmlscale")) ">: "))) (if scale_ml (setvar "cmlscale" scale_ml)) (setq oldlayer (getvar "clayer") oldosm (getvar "osmode")) (setvar "osmode" 0) (setvar "cmdecho" 0) (command "_.ucs" "_world") (repeat (sslength jspl) (setq typent (cdr (assoc 0 (setq dxf_ent (entget (setq ent (ssname jspl nbr)))))) name_layer (cdr (assoc 8 dxf_ent)) ) (cond ((eq typent "LWPOLYLINE") (setq closed (boole 1 (cdr (assoc 70 dxf_ent)) 1) lst (mapcar '(lambda (x) (trans x ent 1)) (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 10)) dxf_ent))) l_bulg (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 42)) dxf_ent)) lst (def_bulg_pl lst l_bulg closed) ) ) ((eq typent "POLYLINE") (setq closed (boole 1 (cdr (assoc 70 dxf_ent)) 1) e_next (entnext ent) ) (while (= "VERTEX" (cdr (assoc 0 (setq dxf_next (entget e_next))))) (if (zerop (boole 1 223 (cdr (assoc 70 dxf_next)))) (setq lst (cons (trans (cdr (assoc 10 dxf_next)) ent 1) lst) l_bulg (cons (cdr (assoc 42 dxf_next)) l_bulg) ) ) (setq e_next (entnext e_next)) ) (setq lst (reverse lst) l_bulg (reverse l_bulg) lst (def_bulg_pl lst l_bulg closed) ) ) ((eq typent "LINE") (setq lst (list (trans (cdr (assoc 10 dxf_ent)) 0 1) (trans (cdr (assoc 11 dxf_ent)) 0 1)) closed 0 ) ) ((eq typent "CIRCLE") (setq lst (bulge_pts (trans (cdr (assoc 10 dxf_ent)) ent 1) (polar (trans (cdr (assoc 10 dxf_ent)) ent 1) 0.0 (cdr (assoc 40 dxf_ent))) (polar (trans (cdr (assoc 10 dxf_ent)) ent 1) (- (* 2.0 pi) (/ (* pi 2.0) 36.0)) (cdr (assoc 40 dxf_ent))) (cdr (assoc 40 dxf_ent)) 1 ) lst (append lst (list (car lst))) closed 1 ) ) ((eq typent "ARC") (setq lst (bulge_pts (trans (cdr (assoc 10 dxf_ent)) ent 1) (polar (trans (cdr (assoc 10 dxf_ent)) ent 1) (cdr (assoc 50 dxf_ent)) (cdr (assoc 40 dxf_ent))) (polar (trans (cdr (assoc 10 dxf_ent)) ent 1) (cdr (assoc 51 dxf_ent)) (cdr (assoc 40 dxf_ent))) (cdr (assoc 40 dxf_ent)) 1 ) closed 0 ) ) ) (cond (lst (setvar "clayer" name_layer) (command "_.mline") (foreach n lst (command n)) (if (not (zerop closed)) (command "_close") (command "")) (entdel ent) ) ) (setq nbr (1+ nbr) lst nil l_bulg nil) ) (command "_.ucs" "_previous") (setvar "clayer" oldlayer) (setvar "osmode" oldosm) (setvar "cmdecho" 1) ) (T (princ "\nSelect is empty")) ) (prin1) )4 points
-
4 points
-
The latest version is now in the first post. I used the @BIGAL codes for MS Excel and LibreOffice Calc, all credit given. Hopefully works in non-AutoCAD programs as well, it worked in AutoCAD 2000i on my home computer, batch wasn't an available option, so I may or may not see why. I forgot how much better Calc looks than Excel, it really looked better with my dark theme, I might need to work on my Excel at work. I just used a quickly made Metric drawing, so hopefully everything is correct, I know getting metric measurements in my Imperial drawings is correct. It now has option for the complete report or just the totals. It also gives the actual measurement of a scaled block and the 1:1 total. It also should first ask to save the CSV in the same folder as the drawing now.2 points
-
From @Steven P's thread. AutoLISP Code Scroll down to Blk_Lib.lsp Blk_Lib.dcl Blk_Lib.doc Also some information on making these types of DCL. Getting Started with Dcl Dialogs just scroll down for DCLs with slide images and Image buttons. This is pretty good as well. https://www.theswamp.org/index.php?topic=20878.msg253445#msg2534452 points
-
In ARX you would use these for general cleanup AcDbDatabase::eraseEmptyObjects(kAllEmptyObj) AcDbDatabase::purge (AcDbObjectIdArray&) # may require multiple passes AcDbDatabase::purge (AcDbObjectIdGraph&) # single pass I made a python sample here. https://www.theswamp.org/index.php?topic=60192 For something like overkill, AcGeCurveCurveInt3d is the go-to class. As it gives overlap information Here’s another python sample for finding overlapping polylines https://www.theswamp.org/index.php?topic=59828 Proxies, you can erase, or call swapid on a non-owned object. AutoCAD won’t save orphaned objects Of course with these types of methods, you must let the end user confirm the operation, as BigAl mentions, they can be destructive2 points
-
Create several splines on the XY plane then move each one in Z so that they have increasing Z values from one spline to the next. In this example the z values for the splines are 0.0, 2, 4, and 6. Use LOFT to create a surface from the splines (shown in red). From the Properties panel, change the U isoline property to a larger value (e.g.,12) and the V isoline value to 0. Select the surface and move the grips to localy adjust the spacing between isolines to meet your requirements. Note, the green arrows show grips that have been moved to increase spacing between adjacent isolines. Unfortunatly, if you need individual polylines or splines on the XY plane you will need to use SECTION to create them individually. For example,section the surface paralle to the XY plane through points at (0,0,0.5), (0,0,1), (0,0,1.5), etc.2 points
-
I have always dimensioned in paper space. Never have experienced any problems. No need to assign multiple scale factors.2 points
-
You could also add these 2, purgezerolangth and purgezerotxt, they will remove some entities but not generally make a massive change to size. (defun PurgeZeroLengths ( / MySS Fuzz acount DelSS MyEnt EndA EndB) ;; for within blocks (setq MySS (ssget (list (cons 0 "LINE,SPLINE,LWPOLYLINE,POLYLINE,ARC,CIRCLE,ELLIPSE")))) (setq Fuzz 0.0001) ; Fuzz factor to delete very short entities (setq acount 0) (setq DelSS (ssadd)) (while (< acount (sslength MySS)) (setq MyEnt (ssname MySS acount)) (if (equal (vlax-curve-getDistAtParam MyEnt (vlax-curve-getEndParam MyEnt)) 0) (progn (setq DelSS (ssadd MyEnt DelSS)) ) ) ; end if ;;If less then a length (if (< (vlax-curve-getDistAtParam MyEnt (vlax-curve-getEndParam MyEnt)) Fuzz) (progn (setq DelSS (ssadd MyEnt DelSS)) ) ) ; end if (setq acount (+ acount 1)) ) ; end while (princ "\nDeleting ")(princ (sslength DelSS))(princ " lines") (command "erase" DelSS "") (princ) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun c:PurgeZeroTexts ( / MySS acount DelSS MyEnt MyText) (setq MySS (ssget (list (cons 0 "*TEXT")(cons 1 "")))) (setq acount 0) (setq DelSS (ssadd)) (if MySS (progn (while (< acount (sslength MySS)) (setq MyEnt (ssname MySS acount)) (setq MyText (cdr (assoc 1 (entget MyEnt)))) (if (equal MyText "") (progn (setq DelSS (ssadd MyEnt DelSS)) ) ) ; end if (setq acount (+ acount 1)) ) ; end while (princ "\nDeleting ")(princ (sslength DelSS))(princ " lines") (command "erase" DelSS "") ) ; end progn (progn (princ "No zero content texts found") ) ) ; end if (princ) )2 points
-
2 points
-
I don't know if there was ever another LISP/Program to do this type of get length at least I never found one, my original just did what I needed, I have since made it more generally useful (I hope). As per the drawing I will attach, I just need to get the length of the center between the inner and outer of the perimeter of guards, etc. to determine the unrolled length. Normally the guards are 3D and I create the profiles with SOLPROF which creates an anonymous block (I used to change these with UNANON) or sometimes in the past I have used SOLVIEW and SOLDRAW, the same issue arises that you just can't select them and get the profile length. So originally that's what this LISP was created to do (I still have some of the older basic versions). I have upgraded it to it's current state and also still working on another version, but only small enhancements. For inside a block that is scaled, you will need to multiply the results by the scale factor, working through a viewport the viewport needs to be active, so I might tackle those issues as well as make a more detailed CSV. I also will try to make sure it works in non-AutoCAD like BricsCAD, CMS IntelliCAD, nanoCAD, etc. when I get time. I lightly tested in most situations, I have no idea how it acts on non-uniformly scaled blocks, though. It handles gaps and slight overlaps, I have some settings at the top, hopefully with enough instructions to modify on your own. Where I work (except for the machine shop which uses decimal inches) they use Architectural units, I did not double check this in Metric, so if someone would report back on that it would help. Guard Test Met.dwg BlkLenTest.dwg GETLEN_2.1.lsp1 point
-
(that was an awesome thread....) Yes, that was the start of me making the above, and using BigAl for inspiration1 point
-
The best thing about QuickSelect is that you can append or remove your selections to/from the previous set. If you need all the manhole blocks on one layer and all the sewer lines on a different layer, for instance, you can pick one of each and use Similar. On the other hand, if you need the pipes in a particular range of lengths, you build one set without the shorter pipes, then remove the pipes that are too long, QED. It may be more complex than other methods, but if there are hundreds or thousands of items to process, it will be quicker.1 point
-
Believe it or not there are still 3 sets of icon menus embedded into the current CUI under: ACAD>Legacy>Image Tile Menus The following are snippets of code to launch each of them for user selection: #1) 3D Objects ; 3D Objects (defun c:3dm ()(menucmd "I=image_3DObjects")(menucmd "I=*")(princ)) After loading 3dm.lsp at the command prompt enter: 3dm #2) Set Spline Fit Variables ; Set Spline Fit Variables (defun c:sfv ()(menucmd "I=image_poly")(menucmd "I=*")(princ)) After loading sfv.lsp at the command prompt enter: sfv #3) Tiled Viewport Layout ; Tiled Viewport Layout (defun c:vpt ()(menucmd "I=image_vporti")(menucmd "I=*")(princ)) After loading vpt.lsp at the command prompt enter: vpt1 point
-
@CivilTechSource the Block/dwg select is part of the POP menu interface, in particular the Icon section. It's just made with Notepad and you save a MNU file., Autocad handles the actual dcl. Re images yes they are slides, SLD files. Ok the how to. 1st step is you must shrink your screen area down to about 1/4 size. When slides were introduced screens were 640x480 so current screens are way more pixels. I use a lisp to make the slides insert say a block, zoom E, Zoom 0.9XP then MSLIDE, Erase last and insert next. Obviously the name of the saved slide is in the lisp. Without going into now you can make like 200 slides very quickly including inserting other block dwg's. You can use a program called Slide library it compresses all your slides into one SLB file a bit easier to manage, I have numerous slb files that contain common items eg landscaping, cars. ***MENUGROUP=CADARC ***POP1 **CADARC2018 [CADARC] LOAD CADARC]^C^C(LOAD "CA3ENTR2013")(LOAD "CA4USRLA-2") [->Set Up] [DRAWING SETUP]^c^C^p(load "ca11set") [--] ............. ............. ............. ............. ***icon **FURN [FURNITURE:] [CTONE(CHAIR-1)]^c^cINSERT ca3ch-1 DRAG \1;;DRAG [CTONE(CHAIR-2)]^c^cINSERT ca3ch-2 DRAG \1;;DRAG [CTONE(SOFA-1)]^c^cINSERT ca3sof1 DRAG \1;;DRAG1 point
-
Block Library pallet - I had that 20 years ago with FastCAD - which inspired me to make something very similar to BigALs - though I think the workings behind are a bit different - might be wrong, BigAl, do you use slide files for the thumbnails? (I remember you giving me a good instruction of them a few years ago now... which I then ignored.... and went with vector images). Can apply any command / LISP to the thumbnails (for example I have a tab 'Get': "Google", "CAD Standards", "Current Folder" which runs just the LISP to open chrome / explorer) - I think BigAl can do the same too. (B&W because I got too lazy to colour them all in)1 point
-
When that is what you need done, NCOPY is a wonderful tool. You don't have to worry about orientation or layers, you don't have to cut and paste from somewhere else, you just select the object(s) you want. I don't use it often, but when I do, it's a real time saver. It's been in AutoCAD since 2013, so there's no excuse not to know about it.1 point
-
@BIGAL this is beautiful, probably this is where AutoDesk got inspiration for the Block Library Pallette. Do you mind sharing the DCL code?1 point
-
I'll try to get to this and finish the Excel today if I can free up some time. I can only test Calc on my home computer, but I'll give it a blind shot at work if I get time, then test and trouble shoot at home. Is the GetLen 2.0.lsp working better in Metric now?1 point
-
Hi, The GeometryExtensions.NET library provides a generic KdTree<T> class which uses parallel computation for building the tree. It also provides an example of Point3dTree class but can used with any type of object providing a 'getPosition' function. // public KdTree(IEnumerable<T> source, Func<T, Point3d>?getPosition, int dimension) var tree = new KdTree<BlockReference>(blockList, br => br.Position, 2);1 point
-
Does it break an Ellipse that was created with PELLIPSE = 1, which is the old style Polyline, a.k.a. Heavy Polyline and 2D Polyline? 3D Polylines?1 point
-
I forgot all about Govert's programs. I use them on the home computers that have AutoCAD 2000i.1 point
-
1 point
-
1 point
-
1 point
-
Just a comment if a dwg has been made by CIV3D the purge command will not remove objects even un used, you need to run PURGESTYLESANDSETTINGS it can make a big difference. After run normal Purge. Also in CIV3D surfaces are inside a dwg. But you may need CIV3D to run purges&s or remove surfaces. Similar for other CAD 3rd party add ons can have lots of proxy objects, you can use "ZOMBIE KILLER" to remove proxy objects, say in Bricscad the opening screen will show a message dwg has proxy objects.1 point
-
1 point
-
For Excel direct the simplest is open a new Excel. You can open an existing excel by file name or even get current Excel Worksheet. You can then get say last row that contains something so that when you add more answers you know the row to start at. I would just make a simple lisp that has all the required defuns in it. Open a new Excel. Then write the row answers. with say a 1 row gap. As version 1. Yes version 2 Open new, use existing, open an existing file. The other defuns that could be added are stuff like color cell text and backgrounds. I called this little lisp "Alan open-read-write excel.lsp" ; Excel function using lisp ; By AlanH and inspiration from others ; Gilles ; JefferyPSanders.com ; Lee-mac ; MunteanStefan ; danielrodriguez ; code by the great FIXO no longer with us (defun Openexcel ( / ) (princ "\nOpening Excel...") ;; Try to get or create Excel instance (setq myxl (vl-catch-all-apply 'vlax-get-or-create-object '("Excel.Application"))) (if (vl-catch-all-error-p myxl) (progn (prompt "\nError: Could not start Excel.") (exit) ) ) (if (= (vlax-get-property (vlax-get-property myXL 'WorkBooks) 'count) 0) (vlax-invoke-method (vlax-get-property myXL 'WorkBooks) 'Add) ) (vla-put-visible myXL :vlax-true) (vlax-put-property myxl 'ScreenUpdating :vlax-true) (vlax-put-property myXL 'DisplayAlerts :vlax-true) (princ) ) ;; Thanks to fixo ;; ;; = Set Excel cell text = ;; (defun xlsetcelltext ( row column text) (setq cells (vlax-get-property (vlax-get-property myxl "ActiveSheet") "Cells")) (vl-catch-all-apply 'vlax-put-property (list cells 'Item row column (vlax-make-variant (vl-princ-to-string text) vlax-vbstring))) ) ;; Thanks to fixo ;; get value of a cell (defun getcell2 (row column / ) (setq cells (vlax-get-property (vlax-get-property myxl "ActiveSheet") "Cells")) (setq cell (vlax-get (vlax-variant-value (vlax-get-property cells "Item" row column)) 'value)) ) A sample sequence. You could put all the code in your program. Maybe later will post something with a Excel option. (if (not openexcel)(load "alan open-read-write.lsp")) (openexcel) (xlsetcelltext 4 4 "Alan") (getcell2 4 4) @SLW210 Happy to do the CSV, Excel or Libreoffice code. Post updated code and dcl etc.1 point
-
I would like to add another advantage of plotting in paper space is the ability to have multiple vports looking at the same area in the model but using different scales.1 point
-
I used to only work in model space and I would never have switched possibly if not for the new office that uses paper space templates.. I see only one advantage of this : publishing automatically all selected pages at once vs plot windows from model space.1 point
-
1 point
-
Hi All I have changed this code to have more options, you can select ByLayer = Layer 0 + ByLayer color ByBlock = Layer 0 + ByBlock color") KeepAllLayers = Keep original layers and colors") you can also select a block or select everything hope someone finds it useful Burst Nested Blocks.lsp1 point
-
I forgot all about this thread, meant to get back to it. My apologies. Elmer FEM – open source multiphysical simulation software CALCULIX: A Three-Dimensional Structural Finite Elemente Program use with PrePoMax Structural Analysis & Steel Design Software | AutoCalcs Free Online 3D Structural Finite Element Analysis Software There are some more open-source and free programs out there. These have a free trial. Finite Element Analysis (FEA) Software | Autodesk Download Inventor | Inventor Free Trial | Autodesk FEA Simulation Basics | Autodesk Inventor 20231 point
-
I don't think it was Excel you loaded the data to in the late 70's, perhaps Lotus 1-2-3 Per wikipediea "Microsoft originally marketed a spreadsheet program called Multiplan in 1982. Multiplan became very popular on CP/M systems, but on MS-DOS systems it lost popularity to Lotus 1-2-3. Microsoft released the first version of Excel for the Macintosh on September 30, 1985, and the first Windows version was 2.05 (to synchronize with the Macintosh version 2.2) in November 1987."1 point
-
All of you here are elite. I don't have any idea what the topic means. I am a newbie here. I am very willing to learn new things. Hope you accept me here.. Thanks in advance1 point
