Recent Posts

Pages: [1] 2 3 ... 10
1
Is this for your homework, or this is pay job?

It looks pretty complex from an eye of novice... Have you just started beeing employee in some company working with drawings?
If you pay someone expirienced like Lee Mac and if he/she has time and if you are willing to pay for a favor I think your request woludn't be in group of vague relation... This way no one won't answer to your request/job...
2
.NET / Re: Laying a 3D Solid Flat to XY Plane
« Last post by Jonesy97 on Today at 05:57:08 AM »
Thanks for the tips. So I've got this far making a matrix and then transforming by, however when I run the line "solidEnt.TransformBy(resultantMatrix);" my autocad freezes with no error message, despite the try catch (System.Exception ex).

Any ideas? Appreciate the help so far!

Code - C#: [Select]
  1.       public void Test()
  2.       {
  3.                 Document doc = ACAD_APP.DocumentManager.MdiActiveDocument;
  4.                 Editor ed = doc.Editor;
  5.                 Database db = HostApplicationServices.WorkingDatabase;
  6.  
  7.                 using (DocumentLock docLoc = doc.LockDocument())
  8.                 {
  9.                         try
  10.                         {
  11.  
  12.                                 PromptEntityOptions peo = new PromptEntityOptions("Select 3D solid.");
  13.                                 peo.SetRejectMessage("\nInvalid selection...");
  14.                                 peo.AddAllowedClass(typeof(Solid3d), true);
  15.  
  16.                                 PromptEntityResult per = ed.GetEntity(peo);
  17.  
  18.                                  if (per.Status != PromptStatus.OK)
  19.                                 {
  20.                                         return;
  21.                                 }
  22.                                 else
  23.                                 {
  24.                                                 using (Transaction trans = db.TransactionManager.StartTransaction())
  25.                                                 {
  26.                                                         Solid3d solid = trans.GetObject(per.ObjectId, OpenMode.ForRead) as Solid3d;
  27.                                                         ObjectId[] ids = new ObjectId[] { per.ObjectId };
  28.  
  29.                                                         FullSubentityPath path = new FullSubentityPath(ids, new SubentityId(SubentityType.Null, IntPtr.Zero));
  30.  
  31.                                                         using (Brep brep = new Brep(path))
  32.                                                         {
  33.                                                                 //get biggest face by making list of areas, and then sorting
  34.                                                                 var faceAreaList = new List<double>();
  35.                                                                 foreach (Autodesk.AutoCAD.BoundaryRepresentation.Face face in brep.Faces)
  36.                                                                 {
  37.                                                                          faceAreaList.Add(face.GetArea());
  38.                                                                        
  39.                                                                 }
  40.                                                                 faceAreaList.Sort();
  41.                                                                 faceAreaList.Reverse();
  42.  
  43.                                                                 foreach (Autodesk.AutoCAD.BoundaryRepresentation.Face face in brep.Faces)
  44.                                                                 {
  45.                                                                         if (face.GetArea() == faceAreaList[0])
  46.                                                                         {
  47.                                                                                 //get point in middle of biggest face, and normal vector
  48.                                                                                 Autodesk.AutoCAD.Geometry.Surface surf = face.Surface;
  49.                                                                                  
  50.                                                                                 Interval[] box = surf.GetEnvelope();
  51.                                                                                 double p1 = box[0].LowerBound + box[0].Length / 2.0;
  52.                                                                                 double p2 = box[1].LowerBound + box[1].Length / 2.0;
  53.                                                                                 Point2d ptParams = new Point2d(p1, p2);
  54.                                                                                 PointOnSurface pos = new PointOnSurface(surf, ptParams);
  55.                                                                                 Vector3d normal = pos.GetNormal(ptParams);
  56.                                                                                 Point3d pt = pos.GetPoint(ptParams);
  57.                                                                                
  58.                                                                                 Matrix3d resultantMatrix = Matrix3d.Identity;
  59.  
  60.                                                                                 //rotation around z axis
  61.                                                                                 Plane xy = new Plane(Point3d.Origin, Vector3d.ZAxis);
  62.  
  63.                                                                                 Matrix3d zAxisTrans = Matrix3d.Rotation(Vector3d.ZAxis.AngleOnPlane(xy) - normal.AngleOnPlane(xy),Vector3d.ZAxis,pt);
  64.                                                                                 normal = normal.TransformBy(zAxisTrans);
  65.                                                                                 resultantMatrix = resultantMatrix.PreMultiplyBy(zAxisTrans);
  66.  
  67.                                                                                 //rotation around x axis
  68.                                                                                 Plane yz = new Plane(Point3d.Origin, Vector3d.ZAxis);
  69.  
  70.                                                                                 Matrix3d xAxisTrans = Matrix3d.Rotation(Vector3d.ZAxis.AngleOnPlane(yz) - normal.AngleOnPlane(yz), Vector3d.ZAxis, pt);
  71.                                                                                 normal = normal.TransformBy(xAxisTrans);
  72.                                                                                 resultantMatrix = resultantMatrix.PreMultiplyBy(xAxisTrans);
  73.  
  74.                                                                                 //rotation around y axis
  75.                                                                                 Plane xz = new Plane(Point3d.Origin, Vector3d.ZAxis);
  76.  
  77.                                                                                 Matrix3d yAxisTrans = Matrix3d.Rotation(Vector3d.ZAxis.AngleOnPlane(xz) - normal.AngleOnPlane(xz), Vector3d.ZAxis, pt);
  78.                                                                                 normal = normal.TransformBy(yAxisTrans);
  79.                                                                                 resultantMatrix = resultantMatrix.PreMultiplyBy(yAxisTrans);
  80.  
  81.                                                                                 solidEnt.TransformBy(resultantMatrix);                                            
  82.                                                                          }
  83.  
  84.                                                                 }
  85.  
  86.                                                        }
  87.                                                        trans.Commit();
  88.                                                 }
  89.                                 }
  90.                      }
  91.                     catch (System.Exception ex)
  92.                     {
  93.                              Autodesk.AutoCAD.ApplicationServices.Core.Application.ShowAlertDialog(ex.Message);
  94.                     }
  95.                  }
  96.         }
  97.  

3
Hi All

We making shop drawing. and each item should be in separate file.
I created a block with parameters.
I am wondering is it possible to do these steps using Lisp
- Read data from excel file.
- Copy CAD from specific location.
- modify block parameters.
- close file.

File path:  "C:\Library\xxx-xxxx-xxxx-xxxx-xx-xx.dwg"
New path: "C:\SD\xxx-xxxx-xxxx-xxxx-xx-xx.dwg"

Attached excel and CAD file.

Thanks in advance.
4
AutoLISP (Vanilla / Visual) / Re: AutoLISP Editor in 2024
« Last post by Lastknownuser on Today at 01:44:56 AM »
Inspired by this thread I played with VS code this weekend, and I'm starting to like it, but I'd like to change color theme for the AutoLisp extension. Anyone know how to do that, since there are no themes available for this extension? I should probably create a new one, but how to add it to this extension? Mainly because I don't like how the variables and numeric values are the same color
5
AutoLISP (Vanilla / Visual) / Re: AutoLISP Editor in 2024
« Last post by 57gmc on March 03, 2024, 12:50:01 PM »
I have serious doubts, but I hope VSCode will force AutoLispers to use more or better documentation habits in their code.

For example to get the hover tips on a custom function you have to add a function header which looks like this:
Code - Auto/Visual Lisp: [Select]
  1. ;|
  2.   Squares a number
  3.   @Param nu number
  4.   @Returns `nu` squared
  5. |;
  6. (defun square (nu)
  7.   (* nu nu))
Good reminder.
6
AutoLISP (Vanilla / Visual) / Re: AutoLISP Editor in 2024
« Last post by 57gmc on March 03, 2024, 12:46:39 PM »

@EnM4st3r

Thanks for that information,
I'll have another look  :-)

Regards,
Thanks for the tip.
7
In previous post are my latest revisions, and assuming to testing results posted on DWG here : https://www.theswamp.org/index.php?topic=59312.msg619513#msg619513 , my (cond) version is faster than (if) version, so I'd like that you download *.ZIP in previous post and translate "roof2d-new-nnnn.lsp" and if there are time (it works desiring speed) to translate "roof2d-new-solutions-n.lsp" into adequate *.arx, or *.brx, or *.dll for versions of AutoCAD 2022 and BricsCAD V23...

This all is just my humble request if someone have time or want to earn some reputation here on theswamp.org...
8
AutoLISP (Vanilla / Visual) / Re: Batch Processing title block info to Excel
« Last post by 57gmc on March 01, 2024, 03:33:56 PM »
I am very confused.
If you want pure data extraction for one or many drawings use the EATTEXT command. You can even make a table from the results if I remember right.

If you just want simple attribute value extraction why don't you try ATTOUT/ATTIN or ATTEXT.

If you want to batch extraction/calculation/replacing/etc. from the same block in several files with my little batch script thing, then you'd just use simple ssget/entget and iterate the attributes, do your calculations/formatting/whatever, and export [append] to a CSV or write them back to the attribute. I don't know what ActiveX has to do with attributes or CSV.

ObjectDBX is another way too I suppose but I've used that so few times I can probably count on one hand. What would happen in the case where someone had the drawing open for edit?
Yeah, the discussion kind of got off track. I'm still going with your dragndrop solution. I'm almost finished with the lisp. I just keep getting pulled to other stuff.
9
AutoLISP (Vanilla / Visual) / Re: Batch Processing title block info to Excel
« Last post by 57gmc on March 01, 2024, 03:32:12 PM »
This method can also be handled by ObjectDB but because ACAD has a bug with justifications of attributes, they will often times get misaligned.
This is not really a bug, but a limitation of trying to justify without opening the drawing in the editor. The calculation can't be done. Just process the file in the editor and alignment should happen ok.
see also https://www.theswamp.org/index.php?topic=52209.msg571916#msg571916
and https://www.theswamp.org/index.php?topic=55890.msg599064#msg599064
Thanks for the links. I didn't know it was a bug. I just knew that it didn't work and I came up with my own solution. That was many years ago.
10
.NET / Re: Debugging Help
« Last post by cmwade77 on March 01, 2024, 01:46:36 PM »
I think GetTransformedCopy is a new object, I'd try wrapping it in a using statement

I found where that is and I have modified it, so that got rid of the disposed error, but I am still getting the error
 Exception thrown: 'Autodesk.AutoCAD.Runtime.Exception' in acdbmgd.dll

with the code below:

Code - C#: [Select]
  1.     internal class BlockJig : EntityJig
  2.     {
  3.         private Database _database; // Add a field to store the database
  4.         private Point3d mPosition = Point3d.Origin;        
  5.         private ObjectId mObjectIdToAlignWith = ObjectId.Null;
  6.         private DynamicBlockReferenceProperty mLengthProperty = null;
  7.         private static ObjectId pickObjId = ObjectId.Null;
  8.         private static ObjectId pickBlockRefId = ObjectId.Null;
  9.         private double mAngleOffset = 0.0;
  10.         private bool mFlipAlignment = false; // Field to store the flip state
  11.         private double mAlignmentAngle = 0.0;
  12.         private bool mLastTabState = false;
  13.         private DateTime mLastTabToggleTime = DateTime.MinValue;
  14.         private TimeSpan mDebounceInterval = TimeSpan.FromMilliseconds(200);
  15.            
  16.        
  17.  
  18.  
  19.         public BlockJig(BlockReference blockRef, Database database) : base(blockRef)
  20.         {
  21.             // Check if the block has an alignment parameter
  22.             if (blockRef.IsDynamicBlock)
  23.             {
  24.                 mLengthProperty = AutoCADFunctions.GetProperty(blockRef, "DUCT_1") ?? AutoCADFunctions.GetProperty(blockRef, "LENGTH");
  25.             }
  26.             mAngleOffset = blockRef.Rotation;
  27.             _database = database;
  28.         }
  29.  
  30.         protected static Editor CurEditor
  31.         {
  32.             get
  33.             {
  34.                 return Application.DocumentManager.MdiActiveDocument.Editor;
  35.             }
  36.         }
  37.  
  38.         protected static Matrix3d UCS
  39.         {
  40.             get
  41.             {
  42.                 return CurEditor.CurrentUserCoordinateSystem;
  43.             }
  44.         }
  45.  
  46.         protected new BlockReference Entity
  47.         {
  48.             get
  49.             {
  50.                 return (BlockReference)base.Entity;
  51.             }
  52.         }
  53.  
  54.  
  55.         protected override SamplerStatus Sampler(JigPrompts prompts)
  56.         {
  57.             JigPromptPointOptions options;
  58.             options = new JigPromptPointOptions("\nBlock insertion point [<Tab> to Flip alignment]:");
  59.  
  60.  
  61.             options.UserInputControls = UserInputControls.Accept3dCoordinates
  62.                                 | UserInputControls.UseBasePointElevation
  63.                                 | UserInputControls.GovernedByOrthoMode
  64.                                 | UserInputControls.NoDwgLimitsChecking
  65.                                 | UserInputControls.NoNegativeResponseAccepted
  66.                                 | UserInputControls.NoZeroResponseAccepted;
  67.  
  68.             PromptPointResult result = prompts.AcquirePoint(options);
  69.  
  70.             if (mPosition.IsEqualTo(result.Value))
  71.             {
  72.                 return SamplerStatus.NoChange;
  73.             }
  74.             else
  75.             {
  76.                 if (result.Status == PromptStatus.Cancel)
  77.                 {
  78.                     return SamplerStatus.Cancel;
  79.                 }
  80.             }            
  81.             mPosition = result.Value.TransformBy(UCS.Inverse());
  82.             mObjectIdToAlignWith = pickObjId;
  83.  
  84.  
  85.             return SamplerStatus.OK;
  86.         }
  87.  
  88.  
  89.  
  90.         protected override bool Update()
  91.         {
  92.             Entity.Position = mPosition;
  93.            
  94.  
  95.             if (!mObjectIdToAlignWith.IsNull)
  96.             {
  97.                 bool currentTabState = Keyboard.IsKeyDown(Key.Tab);
  98.                 DateTime currentTime = DateTime.Now;
  99.  
  100.                 if (currentTabState != mLastTabState && // Check if the Tab key state has changed
  101.                     currentTime - mLastTabToggleTime > mDebounceInterval) // Check if the debounce interval has passed
  102.                 {
  103.                     mFlipAlignment = !mFlipAlignment;
  104.                     mLastTabToggleTime = currentTime;
  105.                 }
  106.  
  107.                 mLastTabState = currentTabState;
  108.  
  109.  
  110.  
  111.                
  112.  
  113.                 using (Transaction tr = _database.TransactionManager.StartTransaction())
  114.                 {
  115.                     using (DBObject obj = tr.GetObject(mObjectIdToAlignWith, OpenMode.ForRead))
  116.                     {
  117.  
  118.                         if (obj is Curve curve)
  119.                         {
  120.                             Matrix3d transform = Matrix3d.Identity;
  121.                             if (!pickBlockRefId.IsNull) // Check if the subentity is part of a block
  122.                             {
  123.                                 using (BlockReference blockRef = tr.GetObject(pickBlockRefId, OpenMode.ForRead) as BlockReference)
  124.                                 {
  125.                                     if (blockRef != null)
  126.                                     {
  127.                                         transform = blockRef.BlockTransform;
  128.                                     }
  129.                                 }
  130.                             }
  131.  
  132.                             using (curve = (Curve)curve.GetTransformedCopy(transform))
  133.                             {
  134.                                 Point3d closestPoint = curve.GetClosestPointTo(Entity.Position, false);
  135.                                 Vector3d dir = curve.GetFirstDerivative(closestPoint).TransformBy(UCS.Inverse());
  136.                                 mAlignmentAngle = Vector3d.XAxis.GetAngleTo(dir, Vector3d.ZAxis);
  137.                             }
  138.  
  139.                             // Apply the flip based on the mFlipAlignment flag
  140.                             if (mFlipAlignment)
  141.                             {
  142.                                 mAlignmentAngle += Math.PI; // Add 180 degrees
  143.                             }
  144.  
  145.                             Entity.Rotation = mAlignmentAngle + mAngleOffset;
  146.                         }
  147.                         else
  148.                         {
  149.                             mObjectIdToAlignWith = ObjectId.Null;
  150.                         }
  151.                     }
  152.  
  153.                     tr.Commit();
  154.                 }                
  155.             }
  156.             else
  157.             {
  158.                     Entity.Rotation = 0.0;                    
  159.  
  160.             }
  161.             AutoCADFunctions.SetDynamicProperties(Entity, 40.0);
  162.             return true;
  163.         }
  164.  
  165.  
  166.  
  167.         public static void Editor_PointMonitor(object sender, PointMonitorEventArgs e)
  168.         {
  169.             Document doc = Application.DocumentManager.MdiActiveDocument;
  170.             Database db = doc.Database;
  171.             Editor ed = doc.Editor;
  172.  
  173.             if (e.Context == null)
  174.             {
  175.                 return;
  176.             }
  177.  
  178.             FullSubentityPath[] fullEntPath = e.Context.GetPickedEntities();
  179.  
  180.             if (fullEntPath.Length > 0)
  181.             {
  182.                 try
  183.                 {
  184.                     using (Transaction tr = db.TransactionManager.StartTransaction())
  185.                     {
  186.                         using (Entity topLevelEntity = tr.GetObject(fullEntPath.First().GetObjectIds().First(), OpenMode.ForRead) as Entity)
  187.                         {
  188.  
  189.                             Point3d cursorPosition = e.Context.ComputedPoint;
  190.  
  191.                             if (topLevelEntity is BlockReference)
  192.                             {
  193.                                 using (BlockReference blockRef = (BlockReference)topLevelEntity)
  194.                                 {
  195.                                     using (BlockTableRecord blockDef = tr.GetObject(blockRef.BlockTableRecord, OpenMode.ForRead) as BlockTableRecord)
  196.                                     {
  197.                                         foreach (ObjectId entId in blockDef)
  198.                                         {
  199.                                             using (Entity subEntity = tr.GetObject(entId, OpenMode.ForRead) as Entity)
  200.                                             {
  201.                                                 if (IsCursorOnEntity(subEntity, cursorPosition, blockRef, tr))
  202.                                                 {
  203.                                                     pickObjId = subEntity.ObjectId;
  204.                                                     pickBlockRefId = blockRef.ObjectId; // Store the block reference ObjectId
  205.                                                     break;
  206.                                                 }
  207.                                             }
  208.                                         }
  209.                                     }
  210.                                 }
  211.                             }
  212.                             else
  213.                             {
  214.                                 pickObjId = topLevelEntity.ObjectId;
  215.                                 pickBlockRefId = ObjectId.Null; // Reset the block reference ObjectId
  216.                             }
  217.                         }
  218.                         tr.Commit();
  219.                     }
  220.                 }
  221.                 catch (System.Exception ex)
  222.                 {
  223.                     if (!string.Equals(ex.Message, "enullextents", StringComparison.OrdinalIgnoreCase))
  224.                     {
  225.                         ed.WriteMessage("\nError: " + ex.Message);
  226.                         pickObjId = ObjectId.Null;
  227.                         pickBlockRefId = ObjectId.Null;
  228.                     }                    
  229.                 }
  230.             }
  231.             else
  232.             {
  233.                 pickObjId = ObjectId.Null;
  234.                 pickBlockRefId = ObjectId.Null;
  235.             }
  236.         }
  237.  
  238.         private static bool IsCursorOnEntity(Entity entity, Point3d cursorPosition, BlockReference blockRef, Transaction tr)
  239.         {
  240.             // Adjust tolerance as needed
  241.             double tolerance = 0.01;
  242.  
  243.             // Transform the cursor position from WCS to the block reference's ECS
  244.             Matrix3d transform = blockRef.BlockTransform.Inverse();
  245.             Point3d transformedCursorPosition = cursorPosition.TransformBy(transform);
  246.  
  247.             // Check if the entity's linetype is ByLayer and the layer is plottable
  248.             if (string.Equals(entity.Linetype, "BYLAYER", StringComparison.OrdinalIgnoreCase))
  249.             {
  250.                 LayerTableRecord layer = tr.GetObject(entity.LayerId, OpenMode.ForRead) as LayerTableRecord;
  251.                 if (layer != null && layer.IsPlottable)
  252.                 {
  253.                     if (entity is Curve curve)
  254.                     {                        
  255.                             // Get the closest point on the curve to the transformed cursor position
  256.                             Point3d closestPoint = curve.GetClosestPointTo(transformedCursorPosition, false);
  257.                             // Check if the distance between the closest point and the transformed cursor position is within the tolerance
  258.                             return transformedCursorPosition.DistanceTo(closestPoint) <= tolerance;                        
  259.                     }
  260.                        
  261.                     else
  262.                     {
  263.                         // For non-curve entities, check if the transformed cursor position is within the entity's geometric extents
  264.                         Extents3d extents = entity.GeometricExtents;
  265.                         return transformedCursorPosition.X >= extents.MinPoint.X - tolerance &&
  266.                                transformedCursorPosition.X <= extents.MaxPoint.X + tolerance &&
  267.                                transformedCursorPosition.Y >= extents.MinPoint.Y - tolerance &&
  268.                                transformedCursorPosition.Y <= extents.MaxPoint.Y + tolerance &&
  269.                                transformedCursorPosition.Z >= extents.MinPoint.Z - tolerance &&
  270.                                transformedCursorPosition.Z <= extents.MaxPoint.Z + tolerance;
  271.                     }
  272.                 }
  273.             }
  274.             return false;
  275.         }
  276.  
  277.  
  278.     }
I have also attached the complete code in case there is an issue somewhere in there since it is too long to post here.
Pages: [1] 2 3 ... 10