.NET

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

How to cut a hole in a hatch

382 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)
            {

            }
        }

 

Mentor
mzakiralam
Posts: 225
Registered: ‎11-09-2012
Message 2 of 3 (363 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: 225
Registered: ‎11-09-2012
Message 3 of 3 (359 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

 

You are not logged in.

Log into access your profile, ask and answer questions, share ideas and more. Haven't signed up yet? Register

Announcements
Are you familiar with the Autodesk Expert Elites? The Expert Elite program is made up of customers that help other customers by sharing knowledge and exemplifying an engaging style of collaboration. To learn more, please visit our Expert Elite website.

Need installation help?

Start with some of our most frequented solutions to get help installing your software.

Ask the Community