03-02 创建和编辑AutoCAD实体二 创建对象2

4、Create Point Objects创建点对象

Point objects can be useful,for example,as node or reference points that you can snap to and offset objects from. Youcan set the style of the point and its size relative to the screen or inabsolute units.

点对象Point有时会很有用,比如用作捕捉的节点或偏移对象的参考点。我们可以设置点的样式以及相对屏幕的大小或以绝对单位表示的大小。

The Pdmode and Pdsize properties of the Database object controlthe appearance of Point objects. A value of 0,2,3,and 4 for Pdmode specify a figure to draw through thepoint. A value of 1 selects nothing to be displayed.

Database对象的Pdmode属性和Pdsize属性用来控制Point对象的外观样式。 Pdmode取值为0、2、3和4指定通过点画的图形外观,取值为1表示什么都不显示。如下图:


Adding 32,64,or 96 to the prevIoUs valueselects a shape to draw around the point in addition to the figure drawnthrough it:

上述Pdmode值分别加上32、64、96表示分别在上述点的外形周围加画上不同的形状,如下图:




Pdsize controls the size of the point figures,except for when Pdmode is 0 and 1. A 0 setting generates the point at 5 percentof the graphics area height. Setting Pdsize to a positive value specifies an absolutesize for the point figures. A negative value is interpreted as a percentage ofthe viewport size. The size of all points is recalculated when the drawing isregenerated.

Pdsize控制点形状的大小(Pdmode取值为0和1时除外)。Pdsize为0时生成的点是图像区域高的5%。Pdsize正值表示点形状的绝对大小,Pdsize正值表示相对视口大小的百分比。图形重新生成时,会重新计算所有点的大小。

After you change Pdmode and Pdsize,the appearance of existing pointschanges the next time the drawing is regenerated.

修改Pdmode和Pdsize的值后,已存在的点的形状会在下次重新生成图形时改变。

Create a Point object and change itsappearance 创建一个点对象并修改其外观

The following example creates a Pointobject in Model space at the coordinate (4,0). The Pdmode and Pdsize properties are then updated.

下例在Model空间创建一个Point对象,坐标为(4,0),然后更新Pdmode和Pdzise属性

VB.NET

ImportsAutodesk.AutoCAD.Runtime

Imports Autodesk.AutoCAD.applicationservices

ImportsAutodesk.AutoCAD.DatabaseServices

ImportsAutodesk.AutoCAD.Geometry

<CommandMethod("AddPointAndSetPointStyle")>_

Public SubAddPointAndSetPointStyle()

'' Get the current document and database

Dim acDoc As Document =Application.DocumentManager.MdiActiveDocument

Dim acCurDb As Database = acDoc.Database

'' Start a transaction

Using acTrans As Transaction =acCurDb.TransactionManager.StartTransaction()

'' Open the Block table for read

Dim acBlkTbl As BlockTable

acBlkTbl =acTrans.Getobject(acCurDb.BlockTableId,OpenMode.ForRead)

'' Open the Block table record Modelspace for write

Dim acBlkTblRec As BlockTableRecord

acBlkTblRec =acTrans.Getobject(acBlkTbl(BlockTableRecord.ModelSpace),_

OpenMode.ForWrite)

'' Create a point at (4,0) in Modelspace

Dim acPoint As DBPoint = New DBPoint(NewPoint3d(4,0))

'' Add the new object to the block tablerecord and the transaction

acBlkTblRec.AppendEntity(acPoint)

acTrans.AddNewlyCreatedDBObject(acPoint,True)

'' Set the style for all point objects inthe drawing

acCurDb.Pdmode = 34

acCurDb.Pdsize = 1

'' Save the new object to the database

acTrans.Commit()

End Using

End Sub

C#

usingAutodesk.AutoCAD.Runtime;

usingAutodesk.AutoCAD.applicationservices;

usingAutodesk.AutoCAD.DatabaseServices;

usingAutodesk.AutoCAD.Geometry;

[CommandMethod("AddPointAndSetPointStyle")]

public static voidAddPointAndSetPointStyle()

{

// Get the current document and database获取当前文档和数据库

Document acDoc =Application.DocumentManager.MdiActiveDocument;

Database acCurDb = acDoc.Database;

// Start a transaction启动事务

using (Transaction acTrans =acCurDb.TransactionManager.StartTransaction())

{

// Open the Block table for read以读打开Block表

BlockTable acBlkTbl;

OpenMode.ForRead) as BlockTable;

// Open the Block table record Modelspace for write

//以写打开Block表的Model空间记录

BlockTableRecord acBlkTblRec;

acBlkTblRec =acTrans.Getobject(acBlkTbl[BlockTableRecord.ModelSpace],255)"> OpenMode.ForWrite)as BlockTableRecord;

// Create a point at (4,0) in Modelspace在Model空间创建一个

DBPoint acPoint = new DBPoint(newPoint3d(4,0));

// Add the new object to the block tablerecord and the transaction

acBlkTblRec.AppendEntity(acPoint);

// Set the style for all point objects inthe drawing

//设置图形中所有点对象的样式

acCurDb.Pdmode = 34;

acCurDb.Pdsize = 1;

// Save the new object to the database保存新对象到数据库

acTrans.Commit();

}

}

VBA/ActiveX CodeReference

SubAddPointAndSetPointStyle()

Dim pointObj As AcadPoint

Dim location(0 To 2) As Double

' Define the location of the point

location(0) = 4#: location(1) = 3#: location(2)= 0#

' Create the point

Set pointObj =ThisDrawing.ModelSpace.AddPoint(location)

ThisDrawing.Setvariable "PDMODE",34

ThisDrawing.Setvariable "PDSIZE",1

ZoomAll

End Sub

5、Create Solid-Filled Areas创建实体填充区域

You can create triangular andquadrilateral areas filled with a color. When creating filled areas,set theFILLMODE system variable to off to improve performance and back on once thefills have been created.

我们可以创建填充有色彩的三角形区域或四边形区域。创建填充区域时,将系统变量FILLMODE设置为off可以提高性能,创建完后可以再设置回on。

When you create a quadrilateralsolid-filled area,the sequence of the third and fourth points determines itsshape. Compare the following illustrations:

创建四边形实体填充区域时,第3、4点的顺序决定区域的形状。比较下面的图例:




The first two points define one edge ofthe polygon. The third point is defined diagonally opposite from the second. Ifthe fourth point is set equal to the third point,then a filled triangle iscreated.

第1、2两点定义多边形的一个边,第3个点定义在第2个点的对角线另一端。如果第4个点设置成和第3个点相等,创建的就是一个三角形填充区域。

For more information about filling solids,see “Create Solid-Filled Areas” in the AutoCAD User's Guide.

关于实体填充的更多内容,见AutoCAD用户指南中“创建实体填充区域”一节。

Create a solid-filled object 创建一个实体填充对象

The following example creates aquadrilateral solid (bow-tie) in Model space using the coordinates (0,0),(5,8,and (0,0). It also creates a quadrilateral solid in arectangular shape using the coordinates (10,(15,(10,and(15,0).

下例用坐标(0,0)、 (5,0)和 (0,0)在Model空间创建一个四边形实体(蝴蝶结),还用坐标(10,0)、 (15,0)、 (10,0)和 (15,0)创建了一个长方形的四边实体。

VB.NET

ImportsAutodesk.AutoCAD.applicationservices

<CommandMethod("Add2DSolid")>_

Public SubAdd2DSolid()

'' Create a quadrilateral (bow-tie) solidin Model space

Dim ac2DSolidBow As Solid = New Solid(NewPoint3d(0,255)"> NewPoint3d(5,255)"> NewPoint3d(0,255)"> acBlkTblRec.AppendEntity(ac2DSolidBow)

acTrans.AddNewlyCreatedDBObject(ac2DSolidBow,255)"> '' Create a quadrilateral (square) solidin Model space

Dim ac2DSolidSqr As Solid = New Solid(NewPoint3d(10,255)"> NewPoint3d(15,255)"> NewPoint3d(10,255)"> acBlkTblRec.AppendEntity(ac2DSolidSqr)

acTrans.AddNewlyCreatedDBObject(ac2DSolidSqr,255)">[CommandMethod("Add2DSolid")]

public static voidAdd2DSolid()

// Get the current document and database

// Start a transaction

// Open the Block table for read

BlockTable acBlkTbl;

OpenMode.ForWrite) as BlockTableRecord;

// Create a quadrilateral (bow-tie) solidin Model space

//在Model空间创建四边形实体(蝴蝶结)

Solid ac2DSolidBow = new Solid(newPoint3d(0,255)"> newPoint3d(5,255)"> newPoint3d(0,255)"> //将新对象添加到块表记录并登记事务

acBlkTblRec.AppendEntity(ac2DSolidBow);

// Create a quadrilateral (square) solidin Model space

//在Model空间创建矩形实体

Solid ac2DSolidSqr = new Solid(new Point3d(10,255)"> newPoint3d(15,255)"> newPoint3d(10,255)"> acBlkTblRec.AppendEntity(ac2DSolidSqr);

// Save the new object to the database

//提交事务,将新对象保存到数据库

}

VBA/ActiveX Code Reference

Sub Add2DSolid()

Dim solidobj As AcadSolid

Dim point1(0 To 2) As Double

Dim point2(0 To 2) As Double

Dim point3(0 To 2) As Double

Dim point4(0 To 2) As Double

' Define the solid

point1(0) = 0#: point1(1) = 0#: point1(2) =0#

point2(0) = 5#: point2(1) = 0#: point2(2) =0#

point3(0) = 5#: point3(1) = 8#: point3(2) =0#

point4(0) = 0#: point4(1) = 8#: point4(2) =0#

' Create the solid object in model space

Set solidobj =ThisDrawing.ModelSpace.AddSolid(point1,point2,point3,point4)

point1(0) = 10#: point1(1) = 0#: point1(2)= 0#

point2(0) = 15#: point2(1) = 0#: point2(2)= 0#

point3(0) = 10#: point3(1) = 8#: point3(2)= 0#

point4(0) = 15#: point4(1) = 8#: point4(2)= 0#

End Sub

6、Work with Regions使用面域

Regions are two-dimensional enclosed areasyou create from closed shapes called loops. A loop is a closed boundary that ismade up of straight and curved objects which do not intersect themselves. Loopscan be combinations of lines,lightweight polylines,2D and 3D polylines,circles,arcs,ellipses,elliptical arcs,splines,3D faces,traces,andsolids.

面域是由称之为环的闭合形状构成的二维闭合区域。环是由互不相交的直的和弯曲的对象组成的闭合边界。环可以是直线、轻量级多段线、2D和3D多段线、圆、圆弧、椭圆、椭圆弧、样条曲线、3D面、宽线和填充实体等的组合。(译者注:Trace绘制宽线,该命令在AutoCAD2012版已废弃。)

The objects that make up the loops musteither be closed or form closed areas by sharing endpoints with other objects.They must also be coplanar (on the same plane). The loops that make up a regionmust be defined as an array of objects.

形成环的对象必须是闭合的,或与其他对象共用端点形成闭合区域。这些对象还必须是共面的(在同一平面上)。构成面域的环必须定义为对象数组。

For more information about working withregions,see “Create and Combine Areas (Regions)” in the AutoCAD User'sGuide.

关于使用面域的更多内容,见AutoCAD用户指南的“创建并合并区域(面域)”一节。

Topics in this section本小节内容

·Create Regions 创建面域

·Create Composite Regions 创建组合面域

6.1、Create Regions创建面域

Regions are added to a BlockTableRecordobject by creating an instance of a Region object and then appending it to aBlockTableRecord. Before you can add it to a BlockTableRecord object,a regionneeds to be calculated based on the objects that form the closed loop. The CreateFromCurves function creates a region out of everyclosed loop formed by the input array of objects. The CreateFromCurves method returns and requires a DBObjectCollectionobject.

通过创建一个Region对象实例并将该实例添加到BlockTableRecord上,来实现将面域添加到BlockTableRecord对象。在添加到BlockTableRecord对象之前,需要基于形成闭环的对象,对面域进行计算。CreateFromCurves函数使用输入的对象数组构成的每个闭环创建面域。CreateFromCurves方法请求并返回一个DBObjectCollection对象。

AutoCAD converts closed 2D and planar 3Dpolylines to separate regions,then converts polylines,lines,and curves thatform closed planar loops. If more than two curves share an endpoint,theresulting region might be arbitrary. Because of this,several regions mayactually be created with the CreateFromCurves method. You need to append each regioncreated to a BlockTableRecord object.

AutoCAD将闭合的二维多段线及平面上的三维多段线转变为单独的面域,然后将形成平面闭环的多段线、直线、曲线转变为面域。如果有两条以上的曲线共用一个端点,那最后得到的面域可能是不确定的。这种情况下,CreateFromCurves方法实际上会创建多个面域。要逐个将得到的面域添加到BlockTableRecord对象中去。

Create a simple region 创建一个简单面域

The following example creates a regionfrom a single circle.

下例用一个圆创建一个面域。

VB.NET

<CommandMethod("AddRegion")>_

Public SubAddRegion()

acBlkTblRec = acTrans.Getobject(acBlkTbl(BlockTableRecord.ModelSpace),255)"> '' Create an in memory circle

Using acCirc As Circle = New Circle()

acCirc.Center = New Point3d(2,0)

acCirc.Radius = 5

'' Adds the circle to an object array

Dim acDBObjColl As DBObjectCollection= New DBObjectCollection()

acDBObjColl.Add(acCirc)

'' Calculate the regions based oneach closed loop

Dim myRegionColl AsDBObjectCollection = New DBObjectCollection()

myRegionColl =Region.CreateFromCurves(acDBObjColl)

Dim acRegion As Region =myRegionColl(0)

'' Add the new object to the blocktable record and the transaction

acBlkTblRec.AppendEntity(acRegion)

acTrans.AddNewlyCreatedDBObject(acRegion,255)"> '' dispose of the in memory objectnot appended to the database

[CommandMethod("AddRegion")]

public static voidAddRegion()

//获取当前文档及数据库

//以写打开Block表记录Model空间

// Create an in memory circle在内存创建一个

using (Circle acCirc = new Circle())

acCirc.Center = new Point3d(2,0);

acCirc.Radius = 5;

// Adds the circle to an object array将圆添加到对象数组

DBObjectCollection acDBObjColl = newDBObjectCollection();

acDBObjColl.Add(acCirc);

// Calculate the regions based oneach closed loop

//基于每个闭环计算面域

DBObjectCollection myRegionColl = newDBObjectCollection();

myRegionColl = Region.CreateFromCurves(acDBObjColl);

Region acRegion = myRegionColl[0] asRegion;

// Add the new object to the blocktable record and the transaction

//添加新对象到块表记录并添加事务

acBlkTblRec.AppendEntity(acRegion);

acTrans.AddNewlyCreatedDBObject(acRegion,255)"> // dispose of the in memory circlenot appended to the database

//处置内存中的圆,不添加数据库;

Sub AddRegion()

' Define an array to hold the

' boundaries of the region.

Dim curves(0 To 0) As AcadCircle

' Create a circle to become a

' boundary for the region.

Dim center(0 To 2) As Double

Dim radius As Double

center(0) = 2

center(1) = 2

center(2) = 0

radius = 5#

Set curves(0) =ThisDrawing.ModelSpace.AddCircle(center,radius)

' Create the region

Dim regionObj As Variant

regionObj = ThisDrawing.ModelSpace.AddRegion(curves)

End Sub

6.2、Create Composite Regions创建组合面域

You can create composite regions bysubtracting,combining,or finding the intersection of regions or 3D solids.You can then extrude or revolve composite regions to create complex solids. Tocreate a composite region,use the Booleanoperation method.

可以通过面域间或3D实体间的差集、并集、交集来创建组合面域,然后通过拉伸或旋转组合面域来创建复杂的实体。创建组合面域,要用到Booleanoperation方法

Subtract regions 差集面域

When you subtract one region from another,you call the Booleanoperation method from the first region. This is theregion from which you want to subtract. For example,to calculate how muchcarpeting is needed for a floor plan,call the Booleanoperation method from the outer boundary of thefloor space and use the non-carpeted areas,such as pillars and counters,asthe object in the Boolean parameter list.

当从一个面域减去另一个面域时,调用一个面域的Booleanoperation方法,这第一个面域就是你要从中减去一部分的那个面域。比如,要计算铺地板需要多少地毯,就从整个地板空间的外便捷调用Booleanoperation方法,并使用不需地毯的区域,如柱子、柜子等,作为布尔参数列表中的对象。

Unite regions 并集面域

To unite regions,call the Booleanoperation method and use the constant BooleanoperationType.BoolUnite for the operation instead of BooleanoperationType.BoolSubtract. You can combine regions in any order tounite them.

要合并面域,调用Booleanoperation方法并用操作类型常量BooleanoperationType.BoolUnite代替BooleanoperationType.BoolSubtract即可。可以以任意顺序对各面域进行合并来获得组合面域。

Find the intersection of two regions 求两个面域的交

To find the intersection of two regions,use the constant BooleanoperationType.BoolIntersect. You can combine regions in any order tointersect them.

求两个面域的交集,使用操作类型常量BooleanoperationType.BoolIntersect来调用Booleanoperation方法。可以以任意顺序对各面域求交集来获得组合面域。

Create a composite region 创建一个组合面域

The following example creates two regionsfrom two circles and then subtracts the smaller region from the large one tocreate a wheel.

下面这个示例用两个圆创建两个面域,然后从较大的一个中减去较小的一个来创建一个轮形面域。

VB.NET

<CommandMethod("CreateCompositeRegions")>_

Public SubCreateCompositeRegions()

'' Create two in memory circles

Dim acCirc1 As Circle = New Circle()

acCirc1.Center = New Point3d(4,4,255)"> acCirc1.Radius = 2

Dim acCirc2 As Circle = New Circle()

acCirc2.Center = New Point3d(4,255)"> acCirc2.Radius = 1

DimacDBObjColl As DBObjectCollection = New DBObjectCollection()

acDBObjColl.Add(acCirc1)

acDBObjColl.Add(acCirc2)

'' Calculate the regions based on eachclosed loop

Dim myRegionColl As DBObjectCollection =New DBObjectCollection()

Dim acRegion1 As Region = myRegionColl(0)

Dim acRegion2 As Region = myRegionColl(1)

'' Subtract region 1 from region 2

If acRegion1.Area > acRegion2.AreaThen

'' Subtract the smaller region from thelarger one

acRegion1.Booleanoperation(BooleanoperationType.BoolSubtract,acRegion2)

acRegion2.dispose()

'' Add the final region to thedatabase

acBlkTblRec.AppendEntity(acRegion1)

acTrans.AddNewlyCreatedDBObject(acRegion1,255)"> Else

'' Subtract the smaller region fromthe larger one

acRegion2.Booleanoperation(BooleanoperationType.BoolSubtract,acRegion1)

acRegion1.dispose()

'' Add the final region to the database

acBlkTblRec.AppendEntity(acRegion2)

acTrans.AddNewlyCreatedDBObject(acRegion2,255)"> End If

'' dispose of the in memory objects notappended to the database

acCirc1.dispose()

acCirc2.dispose()

using Autodesk.AutoCAD.Geometry;

[CommandMethod("CreateCompositeRegions")]

public static voidCreateCompositeRegions()

OpenMode.ForRead) as BlockTable;

//以写打开Model空间

// Create two in memory circles在内存建两个圆

Circle acCirc1 = new Circle();

acCirc1.Center = new Point3d(4,255)"> acCirc1.Radius = 2;

Circle acCirc2 = new Circle();

acCirc2.Center = new Point3d(4,255)"> acCirc2.Radius = 1;

acDBObjColl.Add(acCirc1);

acDBObjColl.Add(acCirc2);

// Calculate the regions based on eachclosed loop

myRegionColl =Region.CreateFromCurves(acDBObjColl);

Region acRegion1 = myRegionColl[0] asRegion;

Region acRegion2 = myRegionColl[1] asRegion;

//Subtract region 1 from region 2

// 从面域2减去面域1

if (acRegion1.Area > acRegion2.Area)

// Subtract the smaller region fromthe larger one

// 从较大面域中减去较小面域

acRegion2.dispose();

// Add the final region to thedatabase

// 将最终的面域添加数据库

acBlkTblRec.AppendEntity(acRegion1);

else

acRegion2.Booleanoperation(BooleanoperationType.BoolSubtract,acRegion1);

acRegion1.dispose();

acBlkTblRec.AppendEntity(acRegion2);

acTrans.AddNewlyCreatedDBObject(acRegion2,255)"> // dispose of the in memory objects notappended to the database

// 销毁内存中的两个圆对象

acCirc1.dispose();

acCirc2.dispose();

// 保存新对象到数据库

}

VBA/ActiveX 代码参考

SubCreateCompositeRegions()

' Create two circles,one representingoutside of the wheel,255)"> ' the other the center of the wheel

Dim DonutParts(0 To 1) As AcadCircle

center(0) = 4

center(1) = 4

radius = 2#

Set WheelParts(0) = ThisDrawing.ModelSpace._

AddCircle(center,255)"> radius = 1#

Set WheelParts(1) = ThisDrawing.ModelSpace._

' Create a region from the two circles

Dim regions As Variant

regions =ThisDrawing.ModelSpace.AddRegion(WheelParts)

' copy the regions into the regionvariables for ease of use

Dim WheelOuter As AcadRegion

Dim WheelInner As AcadRegion

If regions(0).Area > regions(1).AreaThen

' The first region is the outer edge ofthe wheel

Set WheelOuter = regions(0)

Set WheelInner = regions(1)

' The first region is the inner edge ofthe wheel

Set WheelInner = regions(0)

Set WheelOuter = regions(1)

' Subtract the smaller circle from thelarger circle

WheelOuter.Boolean acSubtraction,WheelInner

End Sub

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...