使用颜色
用户可以使用对象的 Color 或 ColorIndex 属性为图形中的单独对象指定颜色。 ColorIndex 属性接受一个数值从 0 到 256 的AutoCAD 颜色索引(ACI)值。Color 属性通常用于指定一个 ACI 编号,真彩色或命名颜色给一个对象。若要修改 Color 属性的值,请使用 Colors 命名空间下的 Color 对象。
Color 对象有 SetRGB 方法允许你从基于红、绿和蓝色之间相互混合组成的数百万种颜色中挑选颜色。Color 对象也包含从指定颜色名字、颜色簿、颜色索引和颜色值获得颜色的方法和属性。
用户也可以为图层指定颜色。如果想让对象从图层中继承颜色,请设置对象的颜色为 ByLayer ,或通过设置它的 ACI 值为 256。任意数量的对象和图层都可以具有同一颜色编号。尽管在屏幕上看不到颜色,用户还是可以指定笔式绘图仪上的各种笔使用不同的颜色编号,或者使用颜色编号来标识图形中的特定对象。
给对象指定颜色值
通过数据库将颜色设置为当前的
用CECOLOR系统变量将颜色设置为当前的
给对象指定颜色值
使用四个不同的方法为每个圆指定不同的颜色。
实体.Color = Color.FromColorIndex(ColorMethod.ByAci, 1)
实体.Color = Color.FromRgb(23, 54, 232)
实体.Color = Color.FromNames("PANTONE Yellow 0131 C", _
"PANTONE(R) pastel coated")
实体.ColorIndex = 4
通过数据库将颜色设置为当前的
通过 Database 对象的 Cecolor 属性设置一个颜色值为当前颜色值。
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Colors
<CommandMethod("SetColorCurrent")> _
Public Sub SetColorCurrent()
'' 获得当前文档 Get the current document
Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
'' 设置当前颜色值 Set the current color
acDoc.Database.Cecolor = Color.FromColorIndex(ColorMethod.ByLayer, 256)
End Sub
用CECOLOR系统变量将颜色设置为当前的
Application.SetSystemVariable("CECOLOR", "1")
使用线型
线型是重复的虚线、点和空格组成的图案。复杂线型则是重复符号的图案。要使用线型,必须先将其加载到图形中。加载之前,LIN 库文件中必须存在该线型的定义。要将线型加载到图形中,请使用 Database 对象的 LoadLineTypeFile 成员方法。
注意不要将 AutoCAD 内部使用的线型与某些打印机提供的硬件线型相混淆。这两种类型的虚线产生的效果相似。请勿同时使用这两种类型,否则将产生不可预知的结果。
试图从 acad.lin 文件中加载线型“CENTER”。如果该线型已存在或者文件不存在,则显示相关消息。
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
<CommandMethod("LoadLinetype")> _
Public Sub LoadLinetype()
'' 获得当前文档和数据库 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 Linetype table for read
Dim acLineTypTbl As LinetypeTable
acLineTypTbl = acTrans.GetObject(acCurDb.LinetypeTableId, _
OpenMode.ForRead)
Dim sLineTypName As String = "Center"
If acLineTypTbl.Has(sLineTypName) = False Then
''加载中心线型 Load the Center Linetype
acCurDb.LoadLineTypeFile(sLineTypName, "acad.lin")
End If
''保存更改并销毁事务 Save the changes and dispose of the transaction
acTrans.Commit()
End Using
End Sub
将线型置为活动的
要使用线型,必须将其置为活动。所有新创建的对象都使用活动线型绘制。有两种不同的方法可以应用一个线型到对象上:直接的或继承的。你可以直接指定一个线型给一个对象来覆盖图层指定给它的线型。否则,若为对象设置为 ByLayer 描述的线型,它将继承图层的 Linetype 或 LinetypeId 属性代表的线型。
注意依赖于外部参照的线型不能置为活动。
有三个线型存在于每个图形中:BYBLOCK、BYLAYER 和 CONTINUOUS。这些线型每一个都可以从线型表对象或使用 SymbolUtilityServices 对象的方法进行访问。下列方法允许你获得这些默认线形的对象编号:
- GetLinetypeByBlockId - 返回 BYBLOCK 线型的 ObjectID。
- GetLinetypeByLayerId - 返回 ByLayer 线型的 ObjectID。
- GetLinetypeContinuousId - 返回 CONTINUOUS 线型的 ObjectID。
给对象指定线型
通过数据库将线型设置为当前的
通过CELTYPE系统变量将线型设置为当前的
给对象指定线型
创建一个圆,然后为其指定“Center” 线型。
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Geometry
<CommandMethod("SetObjectLinetype")> _
Public Sub SetObjectLinetype()
'' 获得当前文档和数据库 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 Linetype table for read
Dim acLineTypTbl As LinetypeTable
acLineTypTbl = acTrans.GetObject(acCurDb.LinetypeTableId, _
OpenMode.ForRead)
Dim sLineTypName As String = "Center"
If acLineTypTbl.Has(sLineTypName) = False Then
acCurDb.LoadLineTypeFile(sLineTypName, "acad.lin")
End If
'' 以只读方式打开块表 Open the Block table for read
Dim acBlkTbl As BlockTable
acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, _
OpenMode.ForRead)
'' 以写方式打开模型空间块表记录 Open the Block table record Model space for write
Dim acBlkTblRec As BlockTableRecord
acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), _
OpenMode.ForWrite)
'' 创建一个圆对象 Create a circle object
Dim acCirc As Circle = New Circle()
acCirc.SetDatabaseDefaults()
acCirc.Center = New Point3d(2, 2, 0)
acCirc.Radius = 1
acCirc.Linetype = sLineTypName
acBlkTblRec.AppendEntity(acCirc)
acTrans.AddNewlyCreatedDBObject(acCirc, True)
''保存更改并销毁事务 Save the changes and dispose of the transaction
acTrans.Commit()
End Using
End Sub
通过数据库将线型设置为当前的
通过 Database 对象的 Celtype 属性将一个线型设置成当前线型。
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
<CommandMethod("SetLinetypeCurrent")> _
Public Sub SetLinetypeCurrent()
'' 获得当前文档和数据库 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 Linetype table for read
Dim acLineTypTbl As LinetypeTable
acLineTypTbl = acTrans.GetObject(acCurDb.LinetypeTableId, _
OpenMode.ForRead)
Dim sLineTypName As String = "Center"
If acLineTypTbl.Has(sLineTypName) = True Then
''设置Center 线型为当前线型 Set the linetype Center current
acCurDb.Celtype = acLineTypTbl(sLineTypName)
''保存修改 Save the changes
acTrans.Commit()
End If
'' 销毁事务 Dispose of the transaction
End Using
End Sub
通过CELTYPE系统变量将线型设置为当前的
Application.SetSystemVariable("CELTYPE", "Center")
重命名线型
要重命名线型,请使用 Name 属性。重命名线型时,只能重命名图形中线型的定义。LIN 库文件中的名称并不会刷新以反映新的名称。
删除线型
要删除线型,请使用 Erase 方法。在执行绘图任务期间,可以随时删除线型,但不能删除 BYLAYER 线型、BYBLOCK 线型、CONTINUOUS 线型、当前线型和依赖于外部参照的线型。另外,被块定义参照的线型也不能删除,即使没有任何对象使用它们。
更改线型说明
线型可以具有与其关联的说明,用于提供线型的 ASCII 表示。用户可以使用 AsciiDescription 属性来指定或修改线型的说明。
线型说明最多可以包含 47 个字符。说明可以是一个注释,也可以使用一系列下划线、点、虚线和空格简单地表示出线型图案。
本例修改当前线型的说明
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
<CommandMethod("ChangeLinetypeDescription")> _
Public Sub ChangeLinetypeDescription()
'' 获得当前文档和数据库 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 Linetype table record of the current linetype for write
Dim acLineTypTblRec As LinetypeTableRecord
acLineTypTblRec = acTrans.GetObject(acCurDb.Celtype, _
OpenMode.ForWrite)
'' 修改当前线型的说明 Change the description of the current linetype
acLineTypTblRec.AsciiDescription = "Exterior Wall"
''保存更改并销毁事务 Save the changes and dispose of the transaction
acTrans.Commit()
End Using
End Sub
指定线型比例
可以为创建的对象指定线型比例。比例越小,每个绘图单元生成的图案重复次数越多。默认情况下,AutoCAD使用的全局线型比例为1.0,等于一个图形单位。可以更改所有图形对象和属性参照的线型比例。
CELTSCALE系统变量为新创建的对象设置线型比例。LTSCALE系统变量更改现有对象和新对象的全局线型比例。对象的线型比例特性用于更改对象的线型比例。对象显示时的线型比例基于单个对象的线型比例乘以全局线型比例。
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Geometry
<CommandMethod("SetObjectLinetypeScale")> _
Public Sub SetObjectLinetypeScale()
'' 获得当前文档和数据库 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()
'' 保存当前线型 Save the current linetype
Dim acObjId As ObjectId = acCurDb.Celtype
'' 设置全局线型比例 Set the global linetype scale
acCurDb.Ltscale = 3
'' 以只读方式打开线型表 Open the Linetype table for read
Dim acLineTypTbl As LinetypeTable
acLineTypTbl = acTrans.GetObject(acCurDb.LinetypeTableId, _
OpenMode.ForRead)
Dim sLineTypName As String = "Border"
If acLineTypTbl.Has(sLineTypName) = False Then
acCurDb.LoadLineTypeFile(sLineTypName, "acad.lin")
End If
'' 设置 Border 线型为当前线型 Set the Border linetype current
acCurDb.Celtype = acLineTypTbl(sLineTypName)
'' 以只读方式打开块表 Open the Block table for read
Dim acBlkTbl As BlockTable
acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, _
OpenMode.ForRead)
'' 以写方式打开模型空间块表记录 Open the Block table record Model space for write
Dim acBlkTblRec As BlockTableRecord
acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), _
OpenMode.ForWrite)
'' 创建一个圆对象,然后设置它的线型比例为全尺寸的一半 Create a circle object and set its linetype
'' scale to half of full size
Dim acCirc1 As Circle = New Circle()
acCirc1.SetDatabaseDefaults()
acCirc1.Center = New Point3d(2, 2, 0)
acCirc1.Radius = 4
acCirc1.LinetypeScale = 0.5
acBlkTblRec.AppendEntity(acCirc1)
acTrans.AddNewlyCreatedDBObject(acCirc1, True)
'' 创建第二个圆对象 Create a second circle object
Dim acCirc2 As Circle = New Circle()
acCirc2.SetDatabaseDefaults()
acCirc2.Center = New Point3d(12, 2, 0)
acCirc2.Radius = 4
acBlkTblRec.AppendEntity(acCirc2)
acTrans.AddNewlyCreatedDBObject(acCirc2, True)
'' 恢复最被的活动线型 Restore the original active linetype
acCurDb.Celtype = acObjId
''保存更改并销毁事务 Save the changes and dispose of the transaction
acTrans.Commit()
End Using
End Sub
保存和恢复图层状态
用户可以在图形中保存图层状态,以后再将其恢复。这样可以很容易地返回到所有图层在绘制或打印期间不同阶段所作的特定设置。
图层状态包括图层是否打开、冻结、锁定、打印、是否在新视口中自动冻结,以及图层的颜色、线型、线宽和打印样式。用户可以指定要保存的设置,还可以保存同一图形中不同编组的设置。
LayerStateManager 用于保存和恢复图层状态。
了解AutoCAD如何保存图层状态
AutoCAD 将图层设置保存在层表对象的扩展词典中。用户首次保存图形中的图层状态时,AutoCAD 将执行以下操作:
- 在层表上创建一个扩展字典。
- 在扩展词典中创建命名为 ACAD_LAYERSTATE 的 Dictionary 对象。
- 将图形中每个图层的特性存储在 ACAD_LAYERSTATE 词典的 XRecord 对象中。AutoCAD 将所有图层设置存储在 XRecord 中,但会标明用户选择保存的特定设置。恢复图层设置时,AutoCAD 仅恢复用户选择保存的设置。
每次保存图形中另一图层设置时,AutoCAD 均将创建另一个描述保存设置的 XRecord 对象,并将 XRecord 存储在 ACAD_LAYERSTATE 词典中。下面的图表说明了这个过程。
用户使用图层状态时,不需要(也不应该)直接操作项目,而应该使用 LayerStateManager 对象的函数访问字典。一旦用户拥有了一个字典的引用,就可以遍历字典中的每一个代表 DBDictionaryEntry 对象的项目。
列出图形中保存的图层设置
如果图层状态已经保存在当前的图形中,则下面的代码列出所有已经保存的图层状态名称:
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
<CommandMethod("ListLayerStates")> _
Public Sub ListLayerStates()
'' 获得当前文档和数据库 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()
Dim acLyrStMan As LayerStateManager
acLyrStMan = acCurDb.LayerStateManager
Dim acDbDict As DBDictionary
acDbDict = acTrans.GetObject(acLyrStMan.LayerStatesDictionaryId(True), _
OpenMode.ForRead)
Dim sLayerStateNames As String = ""
For Each acDbDictEnt As DBDictionaryEntry In acDbDict
sLayerStateNames = sLayerStateNames & vbLf & acDbDictEnt.Key
Next
Application.ShowAlertDialog("The saved layer settings in this drawing are:" & _
sLayerStateNames)
'' 销毁事务 Dispose of the transaction
End Using
End Sub
使用 LayerStateManager 管理图层状态
LayerStateManager 对象提供一组创建和操作保存图层状态的函数。使用下面的 LayerStateManager 函数处理图层状态:
- DeleteLayerState
- 删除已保存的图层状态。
- ExportLayerState
- 将指定的已保存图层状态输出到一个 LAS 文件。
- ImportLayerState
- 从指定的 LAS 文件输入保存的图层状态。
- ImportLayerStateFromDb
- 从另外一个数据库中输入一个图层状态。
- RenameLayerState
- 重命名保存的图层状态。
- RestoreLayerState
- 恢复当前图形中指定的图层设置。
- SaveLayerState
- 保存指定图层的状态和属性。
通过使用 Database 对象的 LayerManagerState 属性可以访问 Database 对象的 LayerStateManager 对象。
- Public Sub ImportLayerState(fileName As String)
- Public Sub SetLayerStateMask(name As String, mask As LayerStateMasks)
- Public Sub DeleteLayerState(name As String)
- Public Sub RenameLayerState(name As String, newName As String)
- Public Sub ExportLayerState(nameToExport As String, fileName As String)
- Public Sub SaveLayerState(name As String, mask As LayerStateMasks, id As ObjectId)
- Public Sub ImportLayerStateFromDb(name As String, database As Database)
- Public Sub SetLayerStateDescription(name As String, description As String)
- Public Sub RestoreLayerState(name As String, id As ObjectId, undefinedLayerStatePolicy As Integer, clientMask As LayerStateMasks)
Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
Dim acCurDb As Database = acDoc.Database
Dim acLyrStMan As LayerStateManager
acLyrStMan = acCurDb.LayerStateManager