Jump to content

All Activity

This stream auto-updates

  1. Past hour
  2. Like others if a revision then a dwg was saved. We also saved a "AS Built" dwg, all our dwg's were recorded and could be looked up, we went back to 1999. They were saved as Tiffs later on as Pdf's. As we controlled the dwg's in regards to access by others, server locked, we made sure only the latest version was in the current working directory, we had a superseded directory. As part of document control a new project had specific directories premade.
  3. Today
  4. ymg3

    KDTree as a NET application.

    @gile, Here I build a bridge to your GeometryExtensions.NET library, exposing essentially the same command that I had in mine . The only addition being GC:KD-MINNODE. I have also built a concavehull in C# using your kd-tree if anybody is interested. ymg using System; using System.IO; using System.Linq; using System.Globalization; using System.Collections.Generic; using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Geometry; using Gile.AutoCAD.R20.Geometry; namespace LispGileBridge { public class ExtensionLoader : IExtensionApplication { public void Initialize() { try { var ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor; // Extracts the absolute running file path dynamically via Reflection string assemblyPath = System.Reflection.Assembly.GetExecutingAssembly().Location; string assemblyName = System.IO.Path.GetFileName(assemblyPath); ed.WriteMessage($"\n--> Assembly File Loaded: \"{assemblyName}\""); ed.WriteMessage($"\n--> Full Path: {assemblyPath}"); ed.WriteMessage("\n--> Available commands:"); ed.WriteMessage("\n (GC:KD-BUILD pointList [dimensions] [customHandle])"); ed.WriteMessage("\n (GC:KD-NEAREST handle Point [count] [maxRadius] [sortFlag])"); ed.WriteMessage("\n (GC:KD-NEAREST-INFO handle Point [count] [maxRadius])"); ed.WriteMessage("\n (GC:KD-RANGE handle Point radius)"); ed.WriteMessage("\n (GC:KD-MINNODE handle dimension)"); ed.WriteMessage("\n (GC:KD-FREE [handle])"); } catch { // Fallback safety silent escape check } } public void Terminate() { } } public class KdTreeBridge { // Thread-safe dictionary tracking string handles to their specific tree instances and properties private static readonly Dictionary<string, (Point3dTree Tree, bool Is2D)> _registry = new Dictionary<string, (Point3dTree, bool)>(StringComparer.OrdinalIgnoreCase); private static int _autoId = 1; // -------------------------------------------------------------------------------- // 1. (gc:kd-build pointList [dimensions] [customHandle]) // -------------------------------------------------------------------------------- [LispFunction("GC:KD-BUILD")] public static object GileKdBuild(ResultBuffer args) { if (args == null) return null; TypedValue[] arr = args.AsArray(); if (arr.Length == 0) return null; try { List<Point3d> pts = ParseLispPoints(arr, 0, out int pointsReadCount); if (pts.Count == 0) return null; // Default dimension to 2D unless explicitly specified as 3 int dimensions = 2; string customHandle = null; if (arr.Length > pointsReadCount) { int nextIdx = pointsReadCount; if (arr[nextIdx].TypeCode == (int)LispDataType.Int32 || arr[nextIdx].TypeCode == (int)LispDataType.Int16) { dimensions = Convert.ToInt32(arr[nextIdx].Value); nextIdx++; } if (arr.Length > nextIdx && arr[nextIdx].TypeCode == (int)LispDataType.Text) { customHandle = Convert.ToString(arr[nextIdx].Value); } } bool is2D = (dimensions == 2); // Gilles' constructor: ignoreZ parameter directly matches our is2D rule Point3dTree tree = new Point3dTree(pts, is2D); string handle = string.IsNullOrEmpty(customHandle) ? $"<KD-TREE-{_autoId++}>" : customHandle; _registry[handle] = (tree, is2D); return handle; } catch (System.Exception ex) { Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage($"\nError in KD-BUILD: {ex.Message}\n"); return null; } } // -------------------------------------------------------------------------------- // 2. (gc:kd-nearest handle targetPoint [count] [maxRadius] [sortFlag]) // -------------------------------------------------------------------------------- [LispFunction("GC:KD-NEAREST")] public static object GileKdNearest(ResultBuffer args) { if (args == null) return null; TypedValue[] arr = args.AsArray(); if (arr.Length < 2) return null; try { string handle = Convert.ToString(arr[0].Value); if (!_registry.TryGetValue(handle, out var entry)) return null; if (arr[1].TypeCode != (int)LispDataType.Point3d) return null; Point3d targetPt = (Point3d)arr[1].Value; int count = 1; double maxRadius = double.MaxValue; int sortFlag = 1; // Default: Sort by Angle if (arr.Length >= 3) count = Convert.ToInt32(arr[2].Value); if (arr.Length >= 4) maxRadius = Convert.ToDouble(arr[3].Value); if (arr.Length >= 5) sortFlag = Convert.ToInt32(arr[4].Value); var searchCollection = entry.Tree.GetNearestNeighbours(targetPt, count); if (searchCollection == null) return null; // Filter by radius limit and compile working list List<Point3d> filtered = new List<Point3d>(); foreach (Point3d pt in searchCollection) { double dist = entry.Is2D ? targetPt.DistanceTo(new Point3d(pt.X, pt.Y, targetPt.Z)) : targetPt.DistanceTo(pt); if (dist <= maxRadius) filtered.Add(pt); } if (filtered.Count == 0) return null; // Execute selected Sort mode if (sortFlag == 0) { filtered = filtered.OrderBy(p => entry.Is2D ? targetPt.DistanceTo(new Point3d(p.X, p.Y, targetPt.Z)) : targetPt.DistanceTo(p)).ToList(); } else { filtered = filtered.OrderBy(p => { double angle = Math.Atan2(p.Y - targetPt.Y, p.X - targetPt.X); return angle < 0 ? angle + (2 * Math.PI) : angle; }).ToList(); } // API Standard Rule Check: If count is 1, return single item. Else, return list. if (count == 1) { return filtered[0]; } ResultBuffer rb = new ResultBuffer(); rb.Add(new TypedValue((int)LispDataType.ListBegin)); foreach (Point3d pt in filtered) rb.Add(new TypedValue((int)LispDataType.Point3d, pt)); rb.Add(new TypedValue((int)LispDataType.ListEnd)); return rb; } catch { return null; } } // -------------------------------------------------------------------------------- // 3. (gc:kd-nearest-info handle targetPoint [count] [maxRadius]) // -------------------------------------------------------------------------------- [LispFunction("GC:KD-NEAREST-INFO")] public static object GileKdNearestInfo(ResultBuffer args) { if (args == null) return null; TypedValue[] arr = args.AsArray(); if (arr.Length < 2) return null; try { string handle = Convert.ToString(arr[0].Value); if (!_registry.TryGetValue(handle, out var entry)) return null; Point3d targetPt = (Point3d)arr[1].Value; int count = 1; double maxRadius = double.MaxValue; if (arr.Length >= 3) count = Convert.ToInt32(arr[2].Value); if (arr.Length >= 4) maxRadius = Convert.ToDouble(arr[3].Value); var searchCollection = entry.Tree.GetNearestNeighbours(targetPt, count); if (searchCollection == null) return null; ResultBuffer rb = new ResultBuffer(); rb.Add(new TypedValue((int)LispDataType.ListBegin)); // Re-locate matches to extract array index mappings cleanly int idx = 0; foreach (Point3d pt in searchCollection) { double dist = entry.Is2D ? targetPt.DistanceTo(new Point3d(pt.X, pt.Y, targetPt.Z)) : targetPt.DistanceTo(pt); if (dist <= maxRadius) { rb.Add(new TypedValue((int)LispDataType.ListBegin)); rb.Add(new TypedValue((int)LispDataType.Point3d, pt)); rb.Add(new TypedValue((int)LispDataType.Int32, idx)); // Metadata index placement rb.Add(new TypedValue((int)LispDataType.Double, dist)); rb.Add(new TypedValue((int)LispDataType.ListEnd)); } idx++; } rb.Add(new TypedValue((int)LispDataType.ListEnd)); return rb; } catch { return null; } } // -------------------------------------------------------------------------------- // 4. (gc:kd-range handle centerPoint radius) // -------------------------------------------------------------------------------- [LispFunction("GC:KD_RANGE")] public static object GileKdRange(ResultBuffer args) { if (args == null) return null; TypedValue[] arr = args.AsArray(); if (arr.Length < 3) return null; try { string handle = Convert.ToString(arr[0].Value); if (!_registry.TryGetValue(handle, out var entry)) return null; Point3d centerPt = (Point3d)arr[1].Value; double radius = Convert.ToDouble(arr[2].Value); // Passing a double directly to GetNearestNeighbours switches Gilles' engine to range search var searchCollection = entry.Tree.GetNearestNeighbours(centerPt, radius); if (searchCollection == null) return null; // Enforce distance sort ordering var sorted = searchCollection.OrderBy(p => entry.Is2D ? centerPt.DistanceTo(new Point3d(p.X, p.Y, centerPt.Z)) : centerPt.DistanceTo(p)).ToList(); ResultBuffer rb = new ResultBuffer(); rb.Add(new TypedValue((int)LispDataType.ListBegin)); foreach (Point3d pt in sorted) rb.Add(new TypedValue((int)LispDataType.Point3d, pt)); rb.Add(new TypedValue((int)LispDataType.ListEnd)); return rb; } catch { return null; } } // -------------------------------------------------------------------------------- // 5. NEW! (gc:kd-minnode handle dimension) -> Useful for Concave Hull base logic // -------------------------------------------------------------------------------- [LispFunction("GC:KD-MINNODE")] public static object GileKdMinNode(ResultBuffer args) { if (args == null) return null; TypedValue[] arr = args.AsArray(); if (arr.Length < 2) return null; try { string handle = Convert.ToString(arr[0].Value); if (!_registry.TryGetValue(handle, out var entry)) return null; int dimension = Convert.ToInt32(arr[1].Value); // 0=X, 1=Y, 2=Z // Target standard range query over all nodes to run aggregate matching var allPoints = entry.Tree.GetNearestNeighbours(Point3d.Origin, double.MaxValue); if (allPoints == null || !allPoints.Any()) return null; Point3d minPoint; switch (dimension) { case 0: // Minimum X coordinate minPoint = allPoints.OrderBy(p => p.X).First(); break; case 1: // Minimum Y coordinate minPoint = allPoints.OrderBy(p => p.Y).First(); break; case 2: // Minimum Z coordinate minPoint = allPoints.OrderBy(p => p.Z).First(); break; default: return null; } return minPoint; } catch { return null; } } // -------------------------------------------------------------------------------- // 6. (gc:kd-free [handle]) // -------------------------------------------------------------------------------- [LispFunction("GC:KD-FREE")] public static object GileKdFree(ResultBuffer args) { int removedCount = 0; if (args == null) { removedCount = _registry.Count; _registry.Clear(); _autoId = 1; } else { TypedValue[] arr = args.AsArray(); if (arr.Length > 0 && arr[0].TypeCode == (int)LispDataType.Text) { string handle = Convert.ToString(arr[0].Value); if (_registry.Remove(handle)) removedCount = 1; } else { removedCount = _registry.Count; _registry.Clear(); _autoId = 1; } } GC.Collect(); GC.WaitForPendingFinalizers(); return removedCount; } // -------------------------------------------------------------------------------- // INTERNAL ROUTINE: Streamlined input coordinate list extractor // -------------------------------------------------------------------------------- private static List<Point3d> ParseLispPoints(TypedValue[] arr, int startIndex, out int readCount) { var collected = new List<Point3d>(); readCount = 0; for (int i = startIndex; i < arr.Length; i++) { if (arr[i].Value is Point3d pt) { collected.Add(pt); readCount++; } else if (arr[i].TypeCode == (int)LispDataType.ListEnd || arr[i].TypeCode == (int)LispDataType.Int32 || arr[i].TypeCode == (int)LispDataType.Text) { break; // Stopped at non-point parameter boundaries } } return collected; } } } essentially the same command that I had in my post.
  5. If you want to learn to do that method... Making a POP with images for inserting blocks or running a program - Autodesk Community
  6. Like @CyberAngel, different places do it different. My current work place, for the work I do, I keep all copies (even those I never released) on a personal (company) cloud drive, the latest revision is the one posted on the network, the drawing name includes the revision number at the end. In most cases, the relevant personnel are emailed that a new revision is out, since one or more of them would have requested a change. P&IDs we keep the old revisions in a separate folder on the network and sometimes the same for certain projects. For contractor drawings I also put old drawings in a folder and only leave the latest revisions on the network. For ongoing projects my boss usually keeps everything in a project folder and then at the end the "As Built" goes on the network, "As Built" as in I usually (or my boss/both of us and/or a relevant engineer) have to go double check everything. Other places I have done them pretty much every method CyberAngel mentioned and probably more, as each company and even sometimes different divisions in a company wanted them done "their way".
  7. This is one of the knottiest issues in engineering work. What constitutes a full revision? When do you issue a partial revision, if you do at all? How do you track the changes? How do you roll them back if necessary? Worst of all, different shops use different criteria, and sometimes the same shop uses different criteria for different projects. It seems like common sense, since storage is so cheap these days, to save a new copy of the drawing for each revision, and append the revision number to the file name. That way the old revisions are still available if you need to refer to them or send them to someone. Even better, keep the revisions in a subfolder so they don't clutter up the main project folder. And this should go without saying--keep current backups! The current working file should have the project name (or whatever) with no revision number. Again, though, some shops will use different standards. For smaller projects, there's no need to keep old revisions, especially if you've sent them out all along. You can go back to those emails for attached copies of old drawings. As always, simpler is better. Make a plan and stick to it. Otherwise you're asking for trouble.
  8. P.S. I meant to mention this in my first response. Your title states... And then you state... You can use an AutoCAD command JOIN... JOIN (Command) | Autodesk In many situations a much better tool. You can experiment with what happens with different combinations or look through the link above.
  9. What if you need different elevations, but still need continuous linework? Flattening the entire drawing would be an issue. This would be a good time to use Qselect (or filters, LISP, et al) to select by Elevation, etc. and Join the polylines, lines, etc. Once again Overkill to remove overlaps, though a custom LISP for it all would be better most likely. As mentioned, having all of that in a drawing should be from untrained cad users and/or poor third party software importing, etc.
  10. I recently worked on a project where every revision was saved as a completely separate DWG file. After a few revisions, it became difficult to know which file was the latest one. A simpler approach is to keep the working DWG as the main file and use DWGPROPS to record revision information such as the revision number, date, and description. For issued drawings, I also keep a clear revision naming convention rather than relying only on the filename. This makes it much easier to identify the current drawing and understand its history. How do you normally manage DWG revisions on larger projects?
  11. SLW210

    A new get length LISP

    Would anybody be interested in having the results in AutoCAD MText/Text and/or a Table? Though for a Table, you can just use the Excel option and then create a table, then Datalink the Excel file. I just use the Notebook option mostly and everything is working in all of my tests, so unless there is a need I will not be adding very much to this. I may, if workload allows, make the DCL a little fancier.
  12. If you want to share the file (or at least enough to see if the issue is a setting) it would be helpful. Woukld a different PDF plotter help? One more thought, try printing to an image file.
  13. Have you tried to use AutoCAD's View command which does have a Save and Restore options? I would typically go inside the Pspace Vport and then run the View command Save option just in case I forget to lock it and I start Zooming around like you mentioned which does quite often happen to me too. Then I'll just use the View command Restore option to get back to the location where it was.
  14. Yesterday
  15. Hey @SLW210 - took a look at and experimented with some of the different setting in the VSM, particularly Lighting Quality.. and I do see clear differences in the print quality, the saw toothing still remains I'll play around with more of the VSM settings and see if I can improve it Thanks very much for your help and suggestions
  16. SLW210

    A new get length LISP

    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.
  17. What often happens to me is that I unlock the viewport to move something, and then I forget to lock it again when I'm done. Later I use the viewport but forget it's unlocked. I zoom in and out to focus on something but affect the model view instead of the viewport. Wherever possible, I use a border in model space (on a nonplot layer of course) to show the edges of the viewport. Then, if something changes the view, it's easy to get it back to the proper scale/location. It would be nice if AutoCAD had a way to save views for you. Revit has that feature, but for some reason AutoCAD doesn't.
  18. (that was an awesome thread....) Yes, that was the start of me making the above, and using BigAl for inspiration
  19. cauldrnofbats

    Help with Penn Foster structural drafting plate 1

    I have been looking at the discussion boards for the past month while working on my structural project for Penn Foster. It has been a great help but I was wondering if anyone could point me to a visual example of plate 3 (Section A)? I'm sure there is one somewhere in the boards but I have not been able to find it. I also don't need details, I am just a visual learner and I know for a fact the drawing I have made for this is completely wrong since the instructions are not clear to me. Any visual for this plate would be of great help! Thank you!
  20. 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.
  21. 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#msg253445
  22. I recently ran into a layout where the viewport was showing the wrong area of the model, even though the model itself was correct. At first I thought the viewport had been moved or resized. The simple fix was to activate the viewport and use ZOOM > Object or PAN to position the view correctly. One thing I also check now is whether the viewport is locked, because a locked viewport can make it confusing when trying to adjust the view. It reminded me that sometimes the drawing is fine and the problem is only with the viewport settings. How do you normally troubleshoot a viewport that suddenly shows the wrong area?
  23. SLW210

    A new get length LISP

    I have the latest version opening in Excel and Calc (at least it was working from AutoCAD 2000i at home), I have a few more tweaks I am working on to make it a little nicer, maybe later today or early tomorrow I can post the update.
  24. Here are a few simple methods to flatten a drawing. How to flatten geometry in a drawing in AutoCAD Products The PDF option is one I tried back when I used a LISP to import vector PDFs as lines, etc. I have run across arcs, circles, etc. that were somehow drawn like that as well. I have found blocks to be the biggest issue to get flat, particularly the ones that you would rather not have to explode. There are a few LISPs, etc. around that can handle the different issues you might run across.
  25. Which ever the situation fits, QSelect is able to do a little more, one really isn't a replacement for the other. I have an "in progress" LISP for a more robust QSelect, I add more options from time to time, but it works well as of now.
  26. Can’t join us in Las Vegas for AU 2026? You can still be part of the experience from wherever you are. AU 2026: The Design & Make Conference takes place September 15-17, bringing together the global Design & Make community to build skills, explore new ideas, and discover what’s next. And with the free AU 2026 Digital Pass, you can access a selection of livestreamed and on-demand sessions online. For the AutoCAD community, that means plenty of opportunities to learn without making the trip to Las Vegas. From AI and automation to cloud-connected workflows, collaboration, customization, and tried-and-true drafting techniques, there’s something for nearly every kind of AutoCAD user. Ready to start planning? Register for your free AU 2026 Digital Pass, then check out these 10 AutoCAD and AutoCAD-connected sessions you can watch online. Get your free AU 2026 Digital Pass AEC Roadmap: AutoCAD Want a front-row seat to what’s next for AutoCAD? Join the AutoCAD product team for a look at the latest enhancements and a preview of upcoming capabilities designed to redefine design and drafting. From improved collaboration to AI-powered productivity, you’ll learn more about the product strategy guiding AutoCAD development and see how customer feedback is helping shape what comes next. View the AutoCAD roadmap session. Click the Enroll or star button to add to your schedule. AutoCAD Tips, Tricks, and the Most-Human Drafting Techniques Looking for practical AutoCAD tips you can put to work right away? Autodesk Expert Elite member Donnie “The CAD Geek” Gladfelter returns with another installment of his popular AutoCAD tips session, blending new AutoCAD 2027 capabilities with the kind of real-world expertise that comes from years of hands-on drafting. Explore features including Geometry Cleanup, Smart Blocks, and Checkout, along with workflows designed to reduce repetitive work, speed up drawing delivery, and help you get more from AutoCAD. Expect plenty of useful techniques, productivity shortcuts, and deep-cut tips that go beyond the basics. View the digital session. Click the Enroll or star button to add to your schedule Accelerating Manufacturing Design: Unlocking the Top 10 Hidden Productivity Tools in AutoCAD Mechanical There may be more power hiding in AutoCAD Mechanical than you realize. Join Sridhar Subramani, Sr. Principal Product Owner at Autodesk, to explore 10 productivity features designed to cut repetitive drafting and help manufacturing teams get more from tools already included in their subscription. Through demos and real-world scenarios, you’ll explore intelligent drawing commands, automated hidden-line management, parametric content libraries, power dimensioning, GD&T and welding symbols, integrated BOMs, engineering calculators, associative Inventor documentation, and more. View the digital session. Click the star on the top-right to add to your schedule. AutoCAD and Autodesk Forma: A CAD Manager’s Playbook for Connected Project Data For CAD managers looking to move beyond fragmented file management, this session takes a closer look at connecting desktop AutoCAD workflows with unified, cloud-based project data through Autodesk Forma Data Management. Learn how connected project data can help AutoCAD teams reduce friction, keep shared information organized, and create more integrated workflows without abandoning the desktop tools they rely on every day. This is an especially useful session for teams thinking about the next step in CAD data management. View the digital session. Click the star on the top-right to add to your schedule. Unlock the Power of AI for AutoCAD 2027 Toolsets What can AI mean for everyday AutoCAD workflows? This session explores how AI-powered capabilities such as object recognition and predictive drafting can help make work in AutoCAD 2027 toolsets more efficient. Tune in for a look at how emerging AI workflows can help automate routine work and give designers more time to focus on higher-value decisions and creative problem-solving. View the digital session. Click the star on the top-right to add to your schedule. Building the Digital Thread: Connecting CRM, Vault PLM, MES, and ERP from Order to Delivery What happens when CAD data becomes part of a truly connected digital thread? Christian Gessner and Markus Gundersen of COOLORANGE explore how engineering and manufacturing teams can connect information across sales, design, production, and enterprise systems. Follow the workflow from a customer order through rule-based CAD automation and engineering data management in Vault, then into Autodesk Fusion Manage, Fusion Operations, and ERP. You’ll see how APIs, automation, and AI-assisted processes can help reduce disconnected handoffs and create a more seamless journey from order to delivery. View the digital session. Click the star on the top-right to add to your schedule. From AutoCAD Toolsets to Inventor: Enabling Connected Workflows with Desktop Connector and Forma AutoCAD doesn’t always work in isolation—and neither do the teams using it. This session explores how AutoCAD toolsets, Inventor, Desktop Connector, and Autodesk Forma can come together to support more connected manufacturing workflows. Discover approaches for bringing electromechanical data and factory layouts together while maintaining continuity between AutoCAD and Inventor, helping teams reduce disconnected processes as work moves between 2D and 3D. View the digital session. Click the star on the top-right to add to your schedule. Boosting Autodesk Development Using AI with AutoLISP and C# .NET If you customize AutoCAD, or you’ve been looking for a reason to start, this session brings AI into the development workflow. Explore how AI coding assistants can help accelerate the creation of AutoLISP routines and C# .NET code for AutoCAD. The session offers a look at how developers and technically minded AutoCAD users can use AI to speed up customization and automation while building tools around their own workflows. View the digital session. Click the star on the top-right to add to your schedule. A.I. Without Chaos: AutoCAD and Revit Plugin Development with Spec-Driven Development AI can make coding faster. But speed doesn’t automatically make the resulting code reliable. Fernando Malard, Chief Technology Officer at ofcdesk, LLC, explores Spec-Driven Development as a structured approach to AI-assisted development for AutoCAD and Revit plug-ins. You’ll learn how persistent specifications can serve as a source of truth, how to separate business logic from platform-specific APIs, and how to make AI-generated code more consistent, maintainable, and easier for teams to review. View the digital session. Click the star on the top-right to add to your schedule. Join AU 2026 From Wherever You Are Whether you’re looking to pick up a new AutoCAD technique, rethink how your team manages project data, explore AI-assisted workflows, or go deeper into customization and automation, AU 2026 Digital gives you a way to keep learning from wherever you work. The AU 2026 Digital Pass is free and provides access to a focused selection of livestreamed and on-demand programming. Digital registration is open now. Register for your Digital Pass, explore the digital session catalog, and start building your AU 2026 watch list. We’ll see you online! Register for your free AU 2026 Digital Pass The post Attend AU 2026 From Anywhere: AutoCAD Sessions to Watch Online appeared first on AutoCAD Blog. View the full article
  27. Last week
  28. Paul Li

    Contribute a tip, become famous

    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: vpt
  29. Actually I prefer to use SelectSimilar. I've also used Filter. I'm not as well versed with QSelect.
  1. Load more activity
×
×
  • Create New...