.NET

Reply
Member
VioletPurple876
Posts: 3
Registered: ‎06-04-2013
Message 1 of 3 (629 Views)
Accepted Solution

How to cut a hole in a hatch

629 Views, 2 Replies
11-11-2013 11:17 PM

I need to cut a hole in the hatch pattern. A hole is a area which is not hatched. I have two closed polylines. I need to hatch the poly1 - poly2 area.

I tried adding both to the ObjectIdCollection, but that throws up an error.

I tried creating Regions and subtracting it. However, we can create Region for the closed polylines, but not the hatch.

Here is the code to create the hatch

 

        [CommandMethod("TestHatchHole", CommandFlags.UsePickSet)]
        public static void CreateHatch()
        {

            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;
            try
            {
                using (Transaction Tx = HostApplicationServices.WorkingDatabase.TransactionManager.StartTransaction())
                {

                    ObjectId ModelSpaceId =
                    SymbolUtilityServices.GetBlockModelSpaceId(db);

                    BlockTableRecord btr = Tx.GetObject(ModelSpaceId,
                                      OpenMode.ForWrite) as BlockTableRecord;

                    Point2d pt = new Point2d(0.0, 0.0);
                    Autodesk.AutoCAD.DatabaseServices.Polyline plBox =
                              new Autodesk.AutoCAD.DatabaseServices.Polyline(4);

                    plBox.Normal = Vector3d.ZAxis;
                    plBox.AddVertexAt(0, pt, 0.0, -1.0, -1.0);
                    plBox.AddVertexAt(1,
                                 new Point2d(pt.X + 50, pt.Y), 0.0, -1.0, -1.0);
                    plBox.AddVertexAt(2,
                              new Point2d(pt.X + 50, pt.Y + 50), 0.0, -1.0, -1.0);
                    plBox.AddVertexAt(3,
                                  new Point2d(pt.X, pt.Y + 50), 0.0, -1.0, -1.0);
                    plBox.Closed = true;

                    ObjectId pLineId;
                    pLineId = btr.AppendEntity(plBox);
                    Tx.AddNewlyCreatedDBObject(plBox, true);


                    Point2d pt1 = new Point2d(0.0, 0.0);
                    Autodesk.AutoCAD.DatabaseServices.Polyline plHole =
                              new Autodesk.AutoCAD.DatabaseServices.Polyline(4);

                    plHole.Normal = Vector3d.ZAxis;
                    plHole.AddVertexAt(0, pt1, 0.0, -1.0, -1.0);
                    plHole.AddVertexAt(1,
                                 new Point2d(pt1.X + 5, pt1.Y), 0.0, -1.0, -1.0);
                    plHole.AddVertexAt(2,
                              new Point2d(pt1.X + 5, pt1.Y + 5), 0.0, -1.0, -1.0);
                    plHole.AddVertexAt(3,
                                  new Point2d(pt1.X, pt1.Y + 5), 0.0, -1.0, -1.0);
                    plHole.Closed = true;

                    var plHoleId = btr.AppendEntity(plHole);
                    Tx.AddNewlyCreatedDBObject(plHole, true);




                    ObjectIdCollection ObjIds = new ObjectIdCollection();
                    ObjIds.Add(pLineId);

                    Hatch oHatch = new Hatch();
                    Vector3d normal = new Vector3d(0.0, 0.0, 1.0);
                    oHatch.Normal = normal;
                    oHatch.Elevation = 0.0;
                    oHatch.PatternScale = 2.0;
                    string hatchPattern = "ANSI31";
                    oHatch.SetHatchPattern(HatchPatternType.PreDefined, hatchPattern);
                    oHatch.ColorIndex = 1;

                    btr.AppendEntity(oHatch);
                    Tx.AddNewlyCreatedDBObject(oHatch, true);
                    //this works ok  
                    oHatch.Associative = true;
                    oHatch.AppendLoop((int)HatchLoopTypes.Default, ObjIds);

                    oHatch.EvaluateHatch(true);

                    Tx.Commit();
                }
            }
            catch (Autodesk.AutoCAD.Runtime.Exception ex)
            {

            }
            catch (System.Exception ex)
            {

            }
        }

 

HI,

Please go through the link, I hope you are looking for something like below:

http://adndevblog.typepad.com/autocad/2013/07/create-hatch-objects-using-trace-boundaries-using-net.html

I have write the code in VB for your purpuse.

 <CommandMethod("HAT")> Public Sub TestHatch()
Dim doc As Document = Application.DocumentManager.MdiActiveDocument
Dim db As Database = doc.Database
Dim ed As Editor = doc.Editor
Dim ppo As PromptPointOptions = New PromptPointOptions(vbLf & "Select a point for hatch boundary:")
Dim ppr As PromptPointResult = ed.GetPoint(ppo)
If ppr.Status <> PromptStatus.OK Then
Return
End If
Dim dbObjColl As DBObjectCollection = ed.TraceBoundary(ppr.Value, True)
Dim loopObjIdColl As ObjectIdCollection = New ObjectIdCollection()
Using tx As Transaction = db.TransactionManager.StartTransaction()
Dim bt As BlockTable = tx.GetObject(db.BlockTableId, OpenMode.ForRead)
Dim ms As BlockTableRecord = tx.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite)
For Each pline As Polyline In dbObjColl
pline.Closed = True
loopObjIdColl.Add(ms.AppendEntity(pline))
tx.AddNewlyCreatedDBObject(pline, True)
Next
Dim _hatch As Hatch = New Hatch()
Dim normal As Vector3d = New Vector3d(0, 0, 1)
_hatch.Normal = normal
_hatch.Elevation = 0
_hatch.PatternScale = 2
_hatch.SetHatchPattern(HatchPatternType.PreDefined, "ANSI31")
_hatch.ColorIndex = 1
ms.AppendEntity(_hatch)
tx.AddNewlyCreatedDBObject(_hatch, True)
_hatch.Associative = True
For Each objId As ObjectId In loopObjIdColl
Dim ids As ObjectIdCollection = New ObjectIdCollection()
ids.Add(objId)
_hatch.AppendLoop(HatchLoopTypes.Outermost, ids)
Next
_hatch.EvaluateHatch(True)
tx.Commit()
End Using
End Sub

 

Mentor
mzakiralam
Posts: 231
Registered: ‎11-09-2012
Message 2 of 3 (610 Views)

Re: How to cut a hole in a hatch

11-12-2013 07:59 AM in reply to: VioletPurple876
HI,

Please go through the link, I hope you are looking for something like below:

http://adndevblog.typepad.com/autocad/2013/07/create-hatch-objects-using-trace-boundaries-using-net....
Mentor
mzakiralam
Posts: 231
Registered: ‎11-09-2012
Message 3 of 3 (606 Views)

Re: How to cut a hole in a hatch

11-12-2013 08:30 AM in reply to: VioletPurple876

I have write the code in VB for your purpuse.

 <CommandMethod("HAT")> Public Sub TestHatch()
        Dim doc As Document = Application.DocumentManager.MdiActiveDocument
        Dim db As Database = doc.Database
        Dim ed As Editor = doc.Editor
        Dim ppo As PromptPointOptions = New PromptPointOptions(vbLf & "Select a point for hatch boundary:")
        Dim ppr As PromptPointResult = ed.GetPoint(ppo)
        If ppr.Status <> PromptStatus.OK Then
            Return
        End If
        Dim dbObjColl As DBObjectCollection = ed.TraceBoundary(ppr.Value, True)
        Dim loopObjIdColl As ObjectIdCollection = New ObjectIdCollection()

        Using tx As Transaction = db.TransactionManager.StartTransaction()
            Dim bt As BlockTable = tx.GetObject(db.BlockTableId, OpenMode.ForRead)
            Dim ms As BlockTableRecord = tx.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite)
            For Each pline As Polyline In dbObjColl
                pline.Closed = True
                loopObjIdColl.Add(ms.AppendEntity(pline))
                tx.AddNewlyCreatedDBObject(pline, True)
            Next

            Dim _hatch As Hatch = New Hatch()
            Dim normal As Vector3d = New Vector3d(0, 0, 1)
            _hatch.Normal = normal
            _hatch.Elevation = 0
            _hatch.PatternScale = 2
            _hatch.SetHatchPattern(HatchPatternType.PreDefined, "ANSI31")
            _hatch.ColorIndex = 1
            ms.AppendEntity(_hatch)
            tx.AddNewlyCreatedDBObject(_hatch, True)
            _hatch.Associative = True

            For Each objId As ObjectId In loopObjIdColl
                Dim ids As ObjectIdCollection = New ObjectIdCollection()
                ids.Add(objId)
                _hatch.AppendLoop(HatchLoopTypes.Outermost, ids)
            Next
            _hatch.EvaluateHatch(True)
            tx.Commit()
        End Using

    End Sub

 

Post to the Community

Have questions about Autodesk products? Ask the community.

New Post
Announcements
Are You Going To Be @ AU 2014? Feel free to drop by our AU topic post and share your plans, plug a class that you're teaching, or simply check out who else from the community might be in attendance. Ohh and don't forgot to stop by the Autodesk Help | Learn | Collaborate booths in the Exhibit Hall and meet our community team if you get a chance!