图纸空间视口是通过创建 Viewport 对象的实例并将其添加到除 Model 之外的布局使用的块引用来创建的。Viewport 对象的构造函数不接受任何用于创建新视口对象的参数。创建 Viewport 对象的实例后,可以使用 和 属性定义其位置。CenterPointWidthHeight 创建 Viewport 对象后,可以设置视图本身的属性,例如查看方向(属性)、透视视图的镜头长度(属性)和网格显示(属性)。您还可以控制视口本身的属性,例如图层 ( 属性)、线型 ( 属性) 和线型缩放 ( 属性)。ViewDirectionLensLengthGridOnLayerLinetypeLinetypeScale 创建并启用浮动视口本示例将图纸空间设置为活动状态,创建浮动视口,定义视口的视图,并启用视口。 VB.NETImports System.Runtime.InteropServices
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Geometry
<DllImport("acad.exe", CallingConvention:=CallingConvention.Cdecl, _
EntryPoint:="?acedSetCurrentVPort@@YA?AW4ErrorStatus@Acad@@PBVAcDbViewport@@@Z")> _
Public Shared Function acedSetCurrentVPort(ByVal AcDbVport As IntPtr) As IntPtr
End Function
<CommandMethod("CreateFloatingViewport")> _
Public Sub CreateFloatingViewport()
'' Get the current document and database, and start a transaction
Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
Dim acCurDb As Database = acDoc.Database
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 Paper space for write
Dim acBlkTblRec As BlockTableRecord
acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.PaperSpace), _
OpenMode.ForWrite)
'' Switch to the previous Paper space layout
Application.SetSystemVariable("TILEMODE", 0)
acDoc.Editor.SwitchToPaperSpace()
'' Create a Viewport
Using acVport As Viewport = New Viewport()
acVport.CenterPoint = New Point3d(3.25, 3, 0)
acVport.Width = 6
acVport.Height = 5
'' Add the new object to the block table record and the transaction
acBlkTblRec.AppendEntity(acVport)
acTrans.AddNewlyCreatedDBObject(acVport, True)
'' Change the view direction
acVport.ViewDirection = New Vector3d(1, 1, 1)
'' Enable the viewport
acVport.On = True
'' Activate model space in the viewport
acDoc.Editor.SwitchToModelSpace()
'' Set the new viewport current via an imported ObjectARX function
acedSetCurrentVPort(acVport.UnmanagedObject)
End Using
'' Save the new objects to the database
acTrans.Commit()
End Using
End Sub
C#using System.Runtime.InteropServices;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
[DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl,
EntryPoint = "?acedSetCurrentVPort@@YA?AW4ErrorStatus@Acad@@PBVAcDbViewport@@@Z")]
extern static private int acedSetCurrentVPort(IntPtr AcDbVport);
[CommandMethod("CreateFloatingViewport")]
public static void CreateFloatingViewport()
{
// Get the current document and database, and start a transaction
Document acDoc = Application.DocumentManager.MdiActiveDocument;
Database acCurDb = acDoc.Database;
using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
{
// Open the Block table for read
BlockTable acBlkTbl;
acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
OpenMode.ForRead) as BlockTable;
// Open the Block table record Paper space for write
BlockTableRecord acBlkTblRec;
acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.PaperSpace],
OpenMode.ForWrite) as BlockTableRecord;
// Switch to the previous Paper space layout
Application.SetSystemVariable("TILEMODE", 0);
acDoc.Editor.SwitchToPaperSpace();
// Create a Viewport
using (Viewport acVport = new Viewport())
{
acVport.CenterPoint = new Point3d(3.25, 3, 0);
acVport.Width = 6;
acVport.Height = 5;
// Add the new object to the block table record and the transaction
acBlkTblRec.AppendEntity(acVport);
acTrans.AddNewlyCreatedDBObject(acVport, true);
// Change the view direction
acVport.ViewDirection = new Vector3d(1, 1, 1);
// Enable the viewport
acVport.On = true;
// Activate model space in the viewport
acDoc.Editor.SwitchToModelSpace();
// Set the new viewport current via an imported ObjectARX function
acedSetCurrentVPort(acVport.UnmanagedObject);
}
// Save the new objects to the database
acTrans.Commit();
}
}
VBA/ActiveX 代码参考Sub CreateFloatingViewport()
' Set the active space to paper space
ThisDrawing.ActiveSpace = acPaperSpace
' Create the paperspace viewport
Dim newVport As AcadPViewport
Dim center(0 To 2) As Double
center(0) = 3.25
center(1) = 3
center(2) = 0
Set newVport = ThisDrawing.PaperSpace. _
AddPViewport(center, 6, 5)
' Change the view direction for the viewport
Dim viewDir(0 To 2) As Double
viewDir(0) = 1
viewDir(1) = 1
viewDir(2) = 1
newVport.direction = viewDir
' Enable the viewport
newVport.Display True
' Switch to model space
ThisDrawing.MSpace = True
' Set newVport current
' (not always necessary but a good idea)
ThisDrawing.ActivePViewport = newVport
End Sub
注意:若要设置或修改视图的各个方面(视图方向、镜头长度等),必须将 Viewport 对象的属性设置为 ,并且在设置视口当前之前,必须将该属性设置为 。OnFALSEOnTRUE
创建四个浮动视口此示例以“创建和启用浮动视口”中的示例为例,通过创建四个浮动视口并将每个视口的视图分别设置为顶部、前视图、右侧视图和等距视图来继续执行此示例。每个视口的比例设置为 1:2。为确保在这些视口中可以看到某些内容,您可能希望在尝试此示例之前在模型空间中创建一个 3D 实体球体。 VB.NETImports System.Runtime.InteropServices
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Geometry
<DllImport("acad.exe", CallingConvention:=CallingConvention.Cdecl, _
EntryPoint:="?acedSetCurrentVPort@@YA?AW4ErrorStatus@Acad@@PBVAcDbViewport@@@Z")> _
Public Shared Function acedSetCurrentVPort(ByVal AcDbVport As IntPtr) As IntPtr
End Function
<CommandMethod("FourFloatingViewports")> _
Public Sub FourFloatingViewports()
'' Get the current document and database, and start a transaction
Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
Dim acCurDb As Database = acDoc.Database
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 Paper space for write
Dim acBlkTblRec As BlockTableRecord
acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.PaperSpace), _
OpenMode.ForWrite)
'' Switch to the previous Paper space layout
Application.SetSystemVariable("TILEMODE", 0)
acDoc.Editor.SwitchToPaperSpace()
Dim acPt3dCol As Point3dCollection = New Point3dCollection()
acPt3dCol.Add(New Point3d(2.5, 5.5, 0))
acPt3dCol.Add(New Point3d(2.5, 2.5, 0))
acPt3dCol.Add(New Point3d(5.5, 5.5, 0))
acPt3dCol.Add(New Point3d(5.5, 2.5, 0))
Dim acVec3dCol As Vector3dCollection = New Vector3dCollection()
acVec3dCol.Add(New Vector3d(0, 0, 1))
acVec3dCol.Add(New Vector3d(0, 1, 0))
acVec3dCol.Add(New Vector3d(1, 0, 0))
acVec3dCol.Add(New Vector3d(1, 1, 1))
Dim dWidth As Double = 2.5
Dim dHeight As Double = 2.5
Dim acVportLast As Viewport = Nothing
Dim nCnt As Integer = 0
For Each acPt3d As Point3d In acPt3dCol
Using acVport As Viewport = New Viewport()
acVport.CenterPoint = acPt3d
acVport.Width = dWidth
acVport.Height = dHeight
'' Add the new object to the block table record and the transaction
acBlkTblRec.AppendEntity(acVport)
acTrans.AddNewlyCreatedDBObject(acVport, True)
'' Change the view direction
acVport.ViewDirection = acVec3dCol(nCnt)
'' Enable the viewport
acVport.On = True
'' Record the last viewport created
acVportLast = acVport
'' Increment the counter by 1
nCnt = nCnt + 1
End Using
Next
If acVportLast <> Nothing Then
'' Activate model space in the viewport
acDoc.Editor.SwitchToModelSpace()
'' Set the new viewport current via an imported ObjectARX function
acedSetCurrentVPort(acVportLast.UnmanagedObject)
End If
'' Save the new objects to the database
acTrans.Commit()
End Using
End Sub
C#using System.Runtime.InteropServices;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
[DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl,
EntryPoint = "?acedSetCurrentVPort@@YA?AW4ErrorStatus@Acad@@PBVAcDbViewport@@@Z")]
extern static private int acedSetCurrentVPort(IntPtr AcDbVport);
[CommandMethod("FourFloatingViewports")]
public static void FourFloatingViewports()
{
// Get the current document and database, and start a transaction
Document acDoc = Application.DocumentManager.MdiActiveDocument;
Database acCurDb = acDoc.Database;
using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
{
// Open the Block table for read
BlockTable acBlkTbl;
acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
OpenMode.ForRead) as BlockTable;
// Open the Block table record Paper space for write
BlockTableRecord acBlkTblRec;
acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.PaperSpace],
OpenMode.ForWrite) as BlockTableRecord;
// Switch to the previous Paper space layout
Application.SetSystemVariable("TILEMODE", 0);
acDoc.Editor.SwitchToPaperSpace();
Point3dCollection acPt3dCol = new Point3dCollection();
acPt3dCol.Add(new Point3d(2.5, 5.5, 0));
acPt3dCol.Add(new Point3d(2.5, 2.5, 0));
acPt3dCol.Add(new Point3d(5.5, 5.5, 0));
acPt3dCol.Add(new Point3d(5.5, 2.5, 0));
Vector3dCollection acVec3dCol = new Vector3dCollection();
acVec3dCol.Add(new Vector3d(0, 0, 1));
acVec3dCol.Add(new Vector3d(0, 1, 0));
acVec3dCol.Add(new Vector3d(1, 0, 0));
acVec3dCol.Add(new Vector3d(1, 1, 1));
double dWidth = 2.5;
double dHeight = 2.5;
Viewport acVportLast = null;
int nCnt = 0;
foreach (Point3d acPt3d in acPt3dCol)
{
using (Viewport acVport = new Viewport())
{
acVport.CenterPoint = acPt3d;
acVport.Width = dWidth;
acVport.Height = dHeight;
// Add the new object to the block table record and the transaction
acBlkTblRec.AppendEntity(acVport);
acTrans.AddNewlyCreatedDBObject(acVport, true);
// Change the view direction
acVport.ViewDirection = acVec3dCol[nCnt];
// Enable the viewport
acVport.On = true;
// Record the last viewport created
acVportLast = acVport;
// Increment the counter by 1
nCnt = nCnt + 1;
}
}
if (acVportLast != null)
{
// Activate model space in the viewport
acDoc.Editor.SwitchToModelSpace();
// Set the new viewport current via an imported ObjectARX function
acedSetCurrentVPort(acVportLast.UnmanagedObject);
}
// Save the new objects to the database
acTrans.Commit();
}
}
VBA/ActiveX 代码参考Sub FourFloatingViewports()
Dim topVport, frontVport As AcadPViewport
Dim rightVport, isoVport As AcadPViewport
Dim pt(0 To 2) As Double
Dim viewDir(0 To 2) As Double
ThisDrawing.ActiveSpace = acPaperSpace
ThisDrawing.MSpace = True
' Take the existing PViewport and make it the topVport
pt(0) = 2.5: pt(1) = 5.5: pt(2) = 0
Set topVport = ThisDrawing.ActivePViewport
' No need to set Direction for top view
topVport.center = pt
topVport.width = 2.5
topVport.height = 2.5
topVport.Display True
topVport.StandardScale = acVp1_2
' Create and setup frontVport
pt(0) = 2.5: pt(1) = 2.5: pt(2) = 0
Set frontVport = ThisDrawing.PaperSpace. _
AddPViewport(pt, 2.5, 2.5)
viewDir(0) = 0: viewDir(1) = 1: viewDir(2) = 0
frontVport.direction = viewDir
frontVport.Display acOn
frontVport.StandardScale = acVp1_2
' Create and setup rightVport
pt(0) = 5.5: pt(1) = 5.5: pt(2) = 0
Set rightVport = ThisDrawing.PaperSpace. _
AddPViewport(pt, 2.5, 2.5)
viewDir(0) = 1: viewDir(1) = 0: viewDir(2) = 0
rightVport.direction = viewDir
rightVport.Display acOn
rightVport.StandardScale = acVp1_2
' Create and set up isoVport
pt(0) = 5.5: pt(1) = 2.5: pt(2) = 0
Set isoVport = ThisDrawing.PaperSpace. _
AddPViewport(pt, 2.5, 2.5)
viewDir(0) = 1: viewDir(1) = 1: viewDir(2) = 1
isoVport.direction = viewDir
isoVport.Display acOn
isoVport.StandardScale = acVp1_2
ThisDrawing.MSpace = True
ThisDrawing.ActivePViewport = isoVport
' Finish: Perform a regen in all viewports
ThisDrawing.Regen True
End Sub
创建非矩形视口本示例创建一个矩形视口,然后使用一个圆作为剪裁边界。 VB.NETImports System.Runtime.InteropServices
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Geometry
<DllImport("acad.exe", CallingConvention:=CallingConvention.Cdecl, _
EntryPoint:="?acedSetCurrentVPort@@YA?AW4ErrorStatus@Acad@@PBVAcDbViewport@@@Z")> _
Public Shared Function acedSetCurrentVPort(ByVal AcDbVport As IntPtr) As IntPtr
End Function
<CommandMethod("CreateNonRectangularFloatingViewport")> _
Public Sub CreateNonRectangularFloatingViewport()
'' Get the current document and database, and start a transaction
Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
Dim acCurDb As Database = acDoc.Database
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 Paper space for write
Dim acBlkTblRec As BlockTableRecord
acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.PaperSpace), _
OpenMode.ForWrite)
'' Switch to the previous Paper space layout
Application.SetSystemVariable("TILEMODE", 0)
acDoc.Editor.SwitchToPaperSpace()
'' Create a rectangular viewport to change to a non-rectangular viewport
Using acVport As Viewport = New Viewport()
acVport.CenterPoint = New Point3d(9, 6.5, 0)
acVport.Width = 2.5
acVport.Height = 2.5
'' Set the scale to 1" = 8'
acVport.CustomScale = 96
'' Create a circle
Using acCirc As Circle = New Circle()
acCirc.Center = acVport.CenterPoint
acCirc.Radius = 1.25
'' Add the new object to the block table record and the transaction
acBlkTblRec.AppendEntity(acCirc)
acTrans.AddNewlyCreatedDBObject(acCirc, True)
'' Clip the viewport using the circle
acVport.NonRectClipEntityId = acCirc.ObjectId
acVport.NonRectClipOn = True
End Using
'' Add the new object to the block table record and the transaction
acBlkTblRec.AppendEntity(acVport)
acTrans.AddNewlyCreatedDBObject(acVport, True)
'' Change the view direction
acVport.ViewDirection = New Vector3d(0, 0, 1)
'' Enable the viewport
acVport.On = True
'' Activate model space
acDoc.Editor.SwitchToModelSpace()
'' Set the new viewport current via an imported ObjectARX function
acedSetCurrentVPort(acVport.UnmanagedObject)
End Using
'' Save the new objects to the database
acTrans.Commit()
End Using
End Sub
C#using System.Runtime.InteropServices;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
[DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl,
EntryPoint = "?acedSetCurrentVPort@@YA?AW4ErrorStatus@Acad@@PBVAcDbViewport@@@Z")]
extern static private int acedSetCurrentVPort(IntPtr AcDbVport);
[CommandMethod("CreateNonRectangularFloatingViewport")]
public static void CreateNonRectangularFloatingViewport()
{
// Get the current document and database, and start a transaction
Document acDoc = Application.DocumentManager.MdiActiveDocument;
Database acCurDb = acDoc.Database;
using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
{
// Open the Block table for read
BlockTable acBlkTbl;
acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
OpenMode.ForRead) as BlockTable;
// Open the Block table record Paper space for write
BlockTableRecord acBlkTblRec;
acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.PaperSpace],
OpenMode.ForWrite) as BlockTableRecord;
// Switch to the previous Paper space layout
Application.SetSystemVariable("TILEMODE", 0);
acDoc.Editor.SwitchToPaperSpace();
// Create a Viewport
using (Viewport acVport = new Viewport())
{
acVport.CenterPoint = new Point3d(9, 6.5, 0);
acVport.Width = 2.5;
acVport.Height = 2.5;
// Set the scale to 1" = 8'
acVport.CustomScale = 96;
// Create a circle
using (Circle acCirc = new Circle())
{
acCirc.Center = acVport.CenterPoint;
acCirc.Radius = 1.25;
// Add the new object to the block table record and the transaction
acBlkTblRec.AppendEntity(acCirc);
acTrans.AddNewlyCreatedDBObject(acCirc, true);
// Clip the viewport using the circle
acVport.NonRectClipEntityId = acCirc.ObjectId;
acVport.NonRectClipOn = true;
}
// Add the new object to the block table record and the transaction
acBlkTblRec.AppendEntity(acVport);
acTrans.AddNewlyCreatedDBObject(acVport, true);
// Change the view direction
acVport.ViewDirection = new Vector3d(0, 0, 1);
// Enable the viewport
acVport.On = true;
// Activate model space in the viewport
acDoc.Editor.SwitchToModelSpace();
// Set the new viewport current via an imported ObjectARX function
acedSetCurrentVPort(acVport.UnmanagedObject);
}
// Save the new objects to the database
acTrans.Commit();
}
}
相关概念父主题: |
|Archiver|CAD开发者社区
( 苏ICP备2022047690号-1 苏公网安备32011402011833)
GMT+8, 2025-10-29 17:08
Powered by Discuz! X3.4
Copyright © 2001-2021, Tencent Cloud.