我正在尝试使用“Window”作为AutoCad中的PlotType
进行绘图。这是代码:
ViewBorder border = new ViewBorder();
Point3d first = new Point3d(border.Width, 0, 0);
Point3d second = new Point3d(border.Height, 0, 0);
Extents2d window = TransformCoordinates(first, second);
psv.SetPlotWindowArea(ps, window);
psv.SetPlotType(ps, Autodesk.AutoCAD.DatabaseServices.PlotType.Extents);
TransformCoordinates方法只接收两个Point3d参数(x和y),并将它们从UCS转换为DCS坐标,返回一个Extents2d。我不想让用户选择点(在互联网上有一些使用这个的例子)。我唯一想要的是“第一”和“第二”变量成为Point3d。第一个必须是ModelSpace中图形的左上角,第二个必须是模型空间图形中的右下角。我怎么能这样做?在PlotType(或其他东西)中是否有任何配置王可以为我管理所有这些,即,不要求用户选择角落并为我选择模型空间中的整个绘图?
答案 0 :(得分:1)
我的经验不是C#和AutoCad。我接受了AutoLISP的培训。但是知道AC如何工作我会说你最好的选择是控制命令提示符为documented here。
通过你所说的我假设你想要印刷模型空间中的东西;那是对的吗?
当您在PaperSpace中时,您可以通过在命令行上键入._MSPACE
来切换到ModelSpace。这将使您能够通过PSpace中的漏洞在MSpace中工作 - 可以这么说。因此,如果PSpace中的布局未显示MSpace的全部内容,则可以切换到MSpace并在命令行中输入z
或键入zoom
。然后,您将使用zoom
工具(全部/中心/动态...)获得任何用户在模型空间内的所有选项。 All
可能是最好的选择。
因此,当用户单击您的按钮或输入您的别名时,您可以自动执行整个过程。您可以切换到MSpace->全部缩放 - >情节 - >布局(要绘制的内容)。
我现在意识到我的链接没有带你到我想要的特定主题。(?)
这是我认为你应该尝试的片段 -
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.Runtime;
[CommandMethod("selectEntireAutoCadDrawing")]
public static void selectEntireAutoCadDrawing()
{
//This sets up your doc. Not sure if this is the way you're doing it.
//I imagine you'd probably pass the doc into the method.
Document yourACDoc = Application.DocumentManager.MdiActiveDocument;
//When your plug-in is invoked the first thing I'd do is make sure they're
//in PaperSpace
yourACDoc.SendStringToExecute("tilemode 0 ");
//Next enable ModelSpace through PaperSpace.
yourACDoc.SendStringToExecute("_mspace ");
//Now we zoom to the extents of the drawing.
//Not sure about the bools at the end. The AC documentation has it there for a
//zoom all example but AC doesn't ask any further questions after selecting the
//all or extents zoom types and doesn't elaborate on it?
yourACDoc.SendStringToExecute("._zoom _extents "/*, true, false, false*/);
//Head back to PaperSpace
yourACDoc.SendStringToExecute("_pspace ");
}
此时你的绘图应该都在PaperSpace中。现在继续执行其余的操作。
AC命令行需要空格键,返回,或者如果设置正确,则单击鼠标以执行任何命令。这就是为什么某些参数之间有空格的原因。这样做至关重要,否则它们将被解释为未知命令。
您可能需要稍微玩一下,查看API参考,或使用其他缩放类型。如果您有多个不同风格的用户,特别是在管理松散的商店中,缩放可能会变得棘手。如果这将在人们意识到它的局限性的环境中实施,那么应该没问题。
另外 - 让自己熟悉AC很好。您可以使用命令行作为调试器,它显示输入的所有命令的列表和任何错误消息。它还允许您提前设计。只需在AC中输入命令即可记录提示的顺序和目的以及相应的代码。还有一种方法可以将动作记录到宏中,这是许多没有编程知识的路径。
祝你好运〜答案 1 :(得分:0)
试试这个。
using Autodesk.AutoCAD.ApplicationServices;
using App = Autodesk.AutoCAD.ApplicationServices.Application;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
Document curDoc = App.DocumentManager.MdiActiveDocument;
Extents3d allEntsExtents = new Extents3d();
using (Transaction tr = curDoc.TransactionManager.StartTransaction())
{
BlockTable bt = tr.GetObject(curDoc.Database.BlockTableId, OpenMode.ForRead, false) as BlockTable;
BlockTableRecord btr = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead, false) as BlockTableRecord;
allEntsExtents.AddBlockExtents(btr);
tr.Commit();
}
Plane plane = new Plane();
Extents2d window = new Extents2d(
allEntsExtents.MinPoint.Convert2d(plane),
allEntsExtents.MaxPoint.Convert2d(plane));