剪辑块和外部参照 (.NET)
通过裁剪外部参照,可以定义外部参照的显示和绘图区域。剪裁边界必须是 2D 多边形或矩形,其顶点被约束为位于外部参照的边界内。同一外部参照的多个实例可以具有不同的边界。 和 对象用于定义外部参照的剪裁边界的属性。使用对象的属性 show 或隐藏剪裁边界。SpatialFilterSpatialFilterDefinitionEnabledSpatialFilterDefinition 裁剪外部参照定义本示例附加外部参照,然后裁剪外部参照,以便仅显示其部分参照。此示例使用在 Sample 目录中找到的 Exterior Elevations.dwg 文件。如果您没有此映像,或者它位于其他目录中,请插入有效的路径和文件名。 VB.NETImports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Geometry
<CommandMethod("ClippingExternalReference")> _
Public Sub ClippingExternalReference()
' Get the current database and start a transaction
Dim acCurDb As Autodesk.AutoCAD.DatabaseServices.Database
acCurDb = Application.DocumentManager.MdiActiveDocument.Database
Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
' Create a reference to a DWG file
Dim PathName As String = "C:\AutoCAD\Sample\Sheet Sets\Architectural\Res\Exterior Elevations.dwg"
Dim acXrefId As ObjectId = acCurDb.AttachXref(PathName, "Exterior Elevations")
' If a valid reference is created then continue
If Not acXrefId.IsNull Then
' Attach the DWG reference to the current space
Dim insPt As New Point3d(1, 1, 0)
Using acBlkRef As New BlockReference(insPt, acXrefId)
Dim acBlkTblRec As BlockTableRecord
acBlkTblRec = acTrans.GetObject(acCurDb.CurrentSpaceId, OpenMode.ForWrite)
acBlkTblRec.AppendEntity(acBlkRef)
acTrans.AddNewlyCreatedDBObject(acBlkRef, True)
MsgBox("The external reference is attached.")
Dim mat As Matrix3d = acBlkRef.BlockTransform
mat.Inverse()
Dim ptCol As New Point2dCollection
' Define the first corner of the clipping boundary
Dim pt3d As New Point3d(-330, 400, 0)
pt3d.TransformBy(mat)
ptCol.Add(New Point2d(pt3d.X, pt3d.Y))
' Define the second corner of the clipping boundary
pt3d = New Point3d(1320, 1120, 0)
pt3d.TransformBy(mat)
ptCol.Add(New Point2d(pt3d.X, pt3d.Y))
' Define the normal and elevation for the clipping boundary
Dim normal As Vector3d
Dim elev As Double = 0
If acCurDb.TileMode = True Then
normal = acCurDb.Ucsxdir.CrossProduct(acCurDb.Ucsydir)
elev = acCurDb.Elevation
Else
normal = acCurDb.Pucsxdir.CrossProduct(acCurDb.Pucsydir)
elev = acCurDb.Pelevation
End If
' Set the clipping boundary and enable it
Using filter As New Filters.SpatialFilter
Dim filterDef As New Filters.SpatialFilterDefinition(ptCol, normal, elev, 0, 0, True)
filter.Definition = filterDef
' Define the name of the extension dictionary and entry name
Dim dictName As String = "ACAD_FILTER"
Dim spName As String = "SPATIAL"
' Check to see if the Extension Dictionary exists, if not create it
If acBlkRef.ExtensionDictionary.IsNull Then
acBlkRef.CreateExtensionDictionary()
End If
' Open the Extension Dictionary for write
Dim extDict As DBDictionary = acTrans.GetObject(acBlkRef.ExtensionDictionary, OpenMode.ForWrite)
' Check to see if the dictionary for clipped boundaries exists,
' and add the spatial filter to the dictionary
If extDict.Contains(dictName) Then
Dim filterDict As DBDictionary = acTrans.GetObject(extDict.GetAt(dictName), OpenMode.ForWrite)
If (filterDict.Contains(spName)) Then filterDict.Remove(spName)
filterDict.SetAt(spName, filter)
Else
Using filterDict As New DBDictionary
extDict.SetAt(dictName, filterDict)
acTrans.AddNewlyCreatedDBObject(filterDict, True)
filterDict.SetAt(spName, filter)
End Using
End If
' Append the spatial filter to the drawing
acTrans.AddNewlyCreatedDBObject(filter, True)
End Using
End Using
MsgBox("The external reference is clipped.")
End If
' Save the new objects to the database
acTrans.Commit()
' Dispose of the transaction
End Using
End Sub
C#using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
[CommandMethod("ClippingExternalReference")]
public void ClippingExternalReference()
{
// Get the current database and start a transaction
Database acCurDb;
acCurDb = Application.DocumentManager.MdiActiveDocument.Database;
using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
{
// Create a reference to a DWG file
string PathName = "C:\\AutoCAD\\Sample\\Sheet Sets\\Architectural\\Res\\Exterior Elevations.dwg";
ObjectId acXrefId = acCurDb.AttachXref(PathName, "Exterior Elevations");
// If a valid reference is created then continue
if (!acXrefId.IsNull)
{
// Attach the DWG reference to the current space
Point3d insPt = new Point3d(1, 1, 0);
using (BlockReference acBlkRef = new BlockReference(insPt, acXrefId))
{
BlockTableRecord acBlkTblRec;
acBlkTblRec = acTrans.GetObject(acCurDb.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
acBlkTblRec.AppendEntity(acBlkRef);
acTrans.AddNewlyCreatedDBObject(acBlkRef, true);
Application.ShowAlertDialog("The external reference is attached.");
Matrix3d mat = acBlkRef.BlockTransform;
mat.Inverse();
Point2dCollection ptCol = new Point2dCollection();
// Define the first corner of the clipping boundary
Point3d pt3d = new Point3d(-330, 400, 0);
pt3d.TransformBy(mat);
ptCol.Add(new Point2d(pt3d.X, pt3d.Y));
// Define the second corner of the clipping boundary
pt3d = new Point3d(1320, 1120, 0);
pt3d.TransformBy(mat);
ptCol.Add(new Point2d(pt3d.X, pt3d.Y));
// Define the normal and elevation for the clipping boundary
Vector3d normal;
double elev = 0;
if (acCurDb.TileMode == true)
{
normal = acCurDb.Ucsxdir.CrossProduct(acCurDb.Ucsydir);
elev = acCurDb.Elevation;
}
else
{
normal = acCurDb.Pucsxdir.CrossProduct(acCurDb.Pucsydir);
elev = acCurDb.Pelevation;
}
// Set the clipping boundary and enable it
using (Autodesk.AutoCAD.DatabaseServices.Filters.SpatialFilter filter =
new Autodesk.AutoCAD.DatabaseServices.Filters.SpatialFilter())
{
Autodesk.AutoCAD.DatabaseServices.Filters.SpatialFilterDefinition filterDef =
new Autodesk.AutoCAD.DatabaseServices.Filters.SpatialFilterDefinition(ptCol, normal, elev, 0, 0, true);
filter.Definition = filterDef;
// Define the name of the extension dictionary and entry name
string dictName = "ACAD_FILTER";
string spName = "SPATIAL";
// Check to see if the Extension Dictionary exists, if not create it
if (acBlkRef.ExtensionDictionary.IsNull)
{
acBlkRef.CreateExtensionDictionary();
}
// Open the Extension Dictionary for write
DBDictionary extDict = acTrans.GetObject(acBlkRef.ExtensionDictionary, OpenMode.ForWrite) as DBDictionary;
// Check to see if the dictionary for clipped boundaries exists,
// and add the spatial filter to the dictionary
if (extDict.Contains(dictName))
{
DBDictionary filterDict = acTrans.GetObject(extDict.GetAt(dictName), OpenMode.ForWrite) as DBDictionary;
if (filterDict.Contains(spName))
{
filterDict.Remove(spName);
}
filterDict.SetAt(spName, filter);
}
else
{
using (DBDictionary filterDict = new DBDictionary())
{
extDict.SetAt(dictName, filterDict);
acTrans.AddNewlyCreatedDBObject(filterDict, true);
filterDict.SetAt(spName, filter);
}
}
// Append the spatial filter to the drawing
acTrans.AddNewlyCreatedDBObject(filter, true);
}
}
Application.ShowAlertDialog("The external reference is clipped.");
}
// Save the new objects to the database
acTrans.Commit();
// Dispose of the transaction
}
}
父主题: |
|Archiver|CAD开发者社区
( 苏ICP备2022047690号-1 苏公网安备32011402011833)
GMT+8, 2025-10-29 22:52
Powered by Discuz! X3.4
Copyright © 2001-2021, Tencent Cloud.