11、Edit Hatches 编辑图案填充
@H_502_4@You can edit both hatch boundaries and hatch patterns. If you edit the boundary of an associative hatch,the pattern is updated as long as the editing results in a valid boundary. Associative hatches are updated even if they're on layers that are turned off. You can modify hatch patterns or choose a new pattern for an existing hatch,but associativity can only be set when a hatch is created. You can check to see if a Hatch object is associative by using the Associative property. @H_502_4@我们可以编辑填充边界和填充图案。如果编辑关联填充的边界,且编辑后边界合法,填充图案就会随之更新。即便所在的图层处于关闭状态,关联填充也会更新。我们可以修改填充图案,或为其选择新的填充图案,但是其关联属性只在填充创建时才能设置。我们可以使用Associative属性检查Hatch对象是否为关联的。 @H_502_4@You must re-evaluate a hatch using the EvaluateHatch method to see any edits to the hatch. @H_502_4@要想看到编辑后的效果,必须使用EvaluateHatch方法重新对所编辑的填充进行求值。 @H_502_4@For more information about editing hatches,see “Modify Hatches and Solid-Filled Areas” in theAutoCAD User's Guide. @H_502_4@更多关于编辑填充的内容,见AutoCAD用户指南中的“修改图案填充和实体填充区域”。11.1、Edit Hatch Boundaries编辑填充边界
@H_502_4@You can append,insert,or remove loops from the boundaries of a Hatch object. Associative hatches are updated to match any changes made to their boundaries. Non-associative hatches are not updated. @H_502_4@我们可以从Hatch对象的边界中追加、插入及删除边界环。关联性填充会更新以适应边界变化,非关联性填充不更新。 @H_502_4@To edit a hatch boundary,use one of the following methods: @H_502_4@下列方法用于编辑填充边界: @H_502_4@AppendLoop @H_502_4@Appends a loop to the hatch. You define the type of loop being appended with first parameter of the AppendLoop method and the constants defined by the HatchLoopTypes enum. @H_502_4@给填充追加一个边界环,所追加边界环的类型由AppendLoop方法的第一个参数和HatchLoopTypes枚举类型的常量定义。 @H_502_4@GetLoopAt @H_502_4@Gets the loop at a given index of a hatch. 获取填充给定索引位置的边界环。 @H_502_4@InsertLoopAt @H_502_4@Inserts a loop at a given index of a hatch. 在填充的给定索引位置插入一个边界环。 @H_502_4@RemoveLoopAt @H_502_4@Deletes a loop at a given index of a hatch. 在填充的给定索引位置删除一个边界环。 @H_502_4@ @H_502_4@To query a hatch boundary,use one of the following methods: @H_502_4@下列方法用于查询填充的边界: @H_502_4@LoopTypeAt @H_502_4@Gets the type of loop at a given index of a hatch. 获取填充给定索引位置边界环的类型。 @H_502_4@NumberOfLoops @H_502_4@Gets the number of loops of a hatch. 获取填充的边界环的个数。 @H_502_4@
@H_502_4@Append an inner loop to a hatch 给填充追加一个内部边界环
@H_502_4@This example creates an associative hatch. It then creates a circle and appends the circle as an inner loop to the hatch.
@H_502_4@本例创建一个关联图案填充,然后创建一个圆并追加该圆作为填充的内部边界环。
@H_502_4@
@H_502_4@VB.NET
@H_502_4@Imports Autodesk.AutoCAD.Runtime
@H_502_4@Imports Autodesk.AutoCAD.ApplicationServices
@H_502_4@Imports Autodesk.AutoCAD.DatabaseServices
@H_502_4@Imports Autodesk.AutoCAD.Geometry
@H_502_4@
@H_502_4@<CommandMethod("EditHatchAppendLoop")> _
@H_502_4@Public Sub EditHatchAppendLoop()
@H_502_4@ '' Get the current document and database
@H_502_4@ Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
@H_502_4@ Dim acCurDb As Database = acDoc.Database
@H_502_4@
@H_502_4@ '' Start a transaction
@H_502_4@ Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
@H_502_4@
@H_502_4@ '' Open the Block table for read
@H_502_4@ Dim acBlkTbl As BlockTable
@H_502_4@ acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,_
@H_502_4@ OpenMode.ForRead)
@H_502_4@
@H_502_4@ '' Open the Block table record Model space for write
@H_502_4@ Dim acBlkTblRec As BlockTableRecord
@H_502_4@ acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace),_
@H_502_4@ OpenMode.ForWrite)
@H_502_4@
@H_502_4@ '' Create an arc object for the closed boundary to hatch
@H_502_4@ Dim acArc As Arc = New Arc(New Point3d(5,3,0),3.141592)
@H_502_4@
@H_502_4@ acBlkTblRec.AppendEntity(acArc)
@H_502_4@ acTrans.AddNewlyCreatedDBObject(acArc,True)
@H_502_4@
@H_502_4@ '' Create an line object for the closed boundary to hatch
@H_502_4@ Dim acLine As Line = New Line(acArc.StartPoint,acArc.EndPoint)
@H_502_4@
@H_502_4@ acBlkTblRec.AppendEntity(acLine)
@H_502_4@ acTrans.AddNewlyCreatedDBObject(acLine,True)
@H_502_4@
@H_502_4@ '' Adds the arc and line to an object id collection
@H_502_4@ Dim acObjIdColl As ObjectIdCollection = New ObjectIdCollection()
@H_502_4@ acObjIdColl.Add(acArc.ObjectId)
@H_502_4@ acObjIdColl.Add(acLine.ObjectId)
@H_502_4@
@H_502_4@ '' Create the hatch object and append it to the block table record
@H_502_4@ Dim acHatch As Hatch = New Hatch()
@H_502_4@ acBlkTblRec.AppendEntity(acHatch)
@H_502_4@ acTrans.AddNewlyCreatedDBObject(acHatch,True)
@H_502_4@
@H_502_4@ '' Set the properties of the hatch object
@H_502_4@ '' Associative must be set after the hatch object is appended to the
@H_502_4@ '' block table record and before AppendLoop
@H_502_4@ acHatch.SetHatchPattern(HatchPatternType.PreDefined,"ANSI31")
@H_502_4@ acHatch.Associative = True
@H_502_4@ acHatch.AppendLoop(HatchLoopTypes.Outermost,acObjIdColl)
@H_502_4@
@H_502_4@ '' Create a circle object for the inner boundary of the hatch
@H_502_4@ Dim acCirc As Circle = New Circle()
@H_502_4@ acCirc.Center = New Point3d(5,4.5,0)
@H_502_4@ acCirc.Radius = 1
@H_502_4@
@H_502_4@ acBlkTblRec.AppendEntity(acCirc)
@H_502_4@ acTrans.AddNewlyCreatedDBObject(acCirc,True)
@H_502_4@
@H_502_4@ '' Adds the circle to an object id collection
@H_502_4@ acObjIdColl.Clear()
@H_502_4@ acObjIdColl.Add(acCirc.ObjectId)
@H_502_4@
@H_502_4@ '' Append the circle as the inner loop of the hatch and evaluate it
@H_502_4@ acHatch.AppendLoop(HatchLoopTypes.Default,acObjIdColl)
@H_502_4@ acHatch.EvaluateHatch(True)
@H_502_4@
@H_502_4@ '' Save the new object to the database
@H_502_4@ acTrans.Commit()
@H_502_4@ End Using
@H_502_4@End Sub
@H_502_4@
@H_502_4@C#
@H_502_4@using Autodesk.AutoCAD.Runtime;
@H_502_4@using Autodesk.AutoCAD.ApplicationServices;
@H_502_4@using Autodesk.AutoCAD.DatabaseServices;
@H_502_4@using Autodesk.AutoCAD.Geometry;
@H_502_4@
@H_502_4@[CommandMethod("EditHatchAppendLoop")]
@H_502_4@public static void EditHatchAppendLoop()
@H_502_4@{
@H_502_4@ // Get the current document and database获取当前文档和数据库
@H_502_4@ Document acDoc = Application.DocumentManager.MdiActiveDocument;
@H_502_4@ Database acCurDb = acDoc.Database;
@H_502_4@
@H_502_4@ // Start a transaction启动事务
@H_502_4@ using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
@H_502_4@ {
@H_502_4@ // Open the Block table for read以读打开块表
@H_502_4@ BlockTable acBlkTbl;
@H_502_4@ acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
@H_502_4@ OpenMode.ForRead) as BlockTable;
@H_502_4@
@H_502_4@ // Open the Block table record Model space for write以写打开块表记录模型空间
@H_502_4@ BlockTableRecord acBlkTblRec;
@H_502_4@ acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],
@H_502_4@ OpenMode.ForWrite) as BlockTableRecord;
@H_502_4@
@H_502_4@ // Create an arc object for the closed boundary to hatch创建一个圆弧对象作为填充的闭合边界
@H_502_4@ Arc acArc = new Arc(new Point3d(5,3.141592);
@H_502_4@
@H_502_4@ acBlkTblRec.AppendEntity(acArc);
@H_502_4@ acTrans.AddNewlyCreatedDBObject(acArc,true);
@H_502_4@
@H_502_4@ // Create an line object for the closed boundary to hatch创建一个直线对象作为填充的闭合边界
@H_502_4@ Line acLine = new Line(acArc.StartPoint,acArc.EndPoint);
@H_502_4@
@H_502_4@ acBlkTblRec.AppendEntity(acLine);
@H_502_4@ acTrans.AddNewlyCreatedDBObject(acLine,true);
@H_502_4@
@H_502_4@ // Adds the arc and line to an object id collection将圆弧和直线添加到ObjectIdCollection
@H_502_4@ ObjectIdCollection acObjIdColl = new ObjectIdCollection();
@H_502_4@ acObjIdColl.Add(acArc.ObjectId);
@H_502_4@ acObjIdColl.Add(acLine.ObjectId);
@H_502_4@
@H_502_4@ // Create the hatch object and append it to the block table record创建Hatch对象
@H_502_4@ Hatch acHatch = new Hatch();
@H_502_4@ acBlkTblRec.AppendEntity(acHatch);
@H_502_4@ acTrans.AddNewlyCreatedDBObject(acHatch,true);
@H_502_4@
@H_502_4@ // Set the properties of the hatch object设置填充对象的属性
@H_502_4@ // Associative must be set after the hatch object is appended to the
@H_502_4@ // block table record and before AppendLoop关联属性必须在将填充对象添加到块表记录之后、执行AppendLoop之前设置
@H_502_4@ acHatch.SetHatchPattern(HatchPatternType.PreDefined,"ANSI31");
@H_502_4@ acHatch.Associative = true;
@H_502_4@ acHatch.AppendLoop(HatchLoopTypes.Outermost,acObjIdColl);
@H_502_4@
@H_502_4@ // Create a circle object for the inner boundary of the hatch创建一个圆对象作为填充的内部边界
@H_502_4@ Circle acCirc = new Circle();
@H_502_4@ acCirc.Center = new Point3d(5,0);
@H_502_4@ acCirc.Radius = 1;
@H_502_4@
@H_502_4@ acBlkTblRec.AppendEntity(acCirc);
@H_502_4@ acTrans.AddNewlyCreatedDBObject(acCirc,true);
@H_502_4@
@H_502_4@ // Adds the circle to an object id collection将圆添加到ObjectIdCollection
@H_502_4@ acObjIdColl.Clear();
@H_502_4@ acObjIdColl.Add(acCirc.ObjectId);
@H_502_4@
@H_502_4@ // Append the circle as the inner loop of the hatch and evaluate it追加圆为内部边界环并对填充对象取值
@H_502_4@ acHatch.AppendLoop(HatchLoopTypes.Default,acObjIdColl);
@H_502_4@ acHatch.EvaluateHatch(true);
@H_502_4@
@H_502_4@ // Save the new object to the database保存到数据库
@H_502_4@ acTrans.Commit();
@H_502_4@ }
@H_502_4@}
@H_502_4@
@H_502_4@VBA/ActiveX Code Reference
@H_502_4@Sub EditHatchAppendLoop()
@H_502_4@ Dim hatchObj As AcadHatch
@H_502_4@ Dim patternName As String
@H_502_4@ Dim PatternType As Long
@H_502_4@ Dim bAssociativity As Boolean
@H_502_4@
@H_502_4@ ' Define and create the hatch
@H_502_4@ patternName = "ANSI31"
@H_502_4@ PatternType = 0
@H_502_4@ bAssociativity = True
@H_502_4@ Set hatchObj = ThisDrawing.ModelSpace. _
@H_502_4@ AddHatch(PatternType,patternName,bAssociativity)
@H_502_4@
@H_502_4@ ' Create the outer loop for the hatch.
@H_502_4@ Dim outerLoop(0 To 1) As AcadEntity
@H_502_4@ Dim center(0 To 2) As Double
@H_502_4@ Dim radius As Double
@H_502_4@ Dim startAngle As Double
@H_502_4@ Dim endAngle As Double
@H_502_4@ center(0) = 5: center(1) = 3: center(2) = 0
@H_502_4@ radius = 3
@H_502_4@ startAngle = 0
@H_502_4@ endAngle = 3.141592
@H_502_4@ Set outerLoop(0) = ThisDrawing.ModelSpace. _
@H_502_4@ AddArc(center,radius,startAngle,endAngle)
@H_502_4@ Set outerLoop(1) = ThisDrawing.ModelSpace. _
@H_502_4@ AddLine(outerLoop(0).startPoint,outerLoop(0).endPoint)
@H_502_4@
@H_502_4@ ' Append the outer loop to the hatch object
@H_502_4@ hatchObj.AppendOuterLoop (outerLoop)
@H_502_4@
@H_502_4@ ' Create a circle as the inner loop for the hatch.
@H_502_4@ Dim innerLoop(0) As AcadEntity
@H_502_4@ center(0) = 5: center(1) = 4.5: center(2) = 0
@H_502_4@ radius = 1
@H_502_4@ Set innerLoop(0) = ThisDrawing.ModelSpace. _
@H_502_4@ AddCircle(center,radius)
@H_502_4@
@H_502_4@ ' Append the circle as an inner loop to the hatch
@H_502_4@ hatchObj.AppendInnerLoop (innerLoop)
@H_502_4@
@H_502_4@ ' Evaluate and display the hatch
@H_502_4@ hatchObj.Evaluate
@H_502_4@ ThisDrawing.Regen True
@H_502_4@End Sub