2

PlotTypeAutoCad のように「ウィンドウ」を使用してプロットしようとしています。これはコードです:

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 メソッドは、2 つの Point3d 引数 (x と y) のみを受け取り、それらを UCS 座標から DCS 座標に変換して、Extents2d を返します。ユーザーにポイントの選択を求めたくない (これを使用した例がインターネット上にいくつかあります)。私が欲しいのは、「最初」と「2番目」の変数がPoint3dになることだけです。1 つ目はモデル空間の図面の左上隅で、2 つ目はモデル空間図面の右下隅でなければなりません。どうすればそれができますか?PlotType (または他のもの) に、これらすべてを管理できる構成の王様はいますか?

4

2 に答える 2

1

私の経験はC#とAutoCadではありません。私はAutoLISPのトレーニングを受けました。しかし、ACがどのように機能するかを知っていると、ここに記載されているように、コマンドプロンプトを制御するのが最善の策だと思います。

あなたが言ったことによって、私はあなたがモデル空間にあるものを何でも印刷したいと思っていると思います。あれは正しいですか?

._MSPACEPaperSpaceを使用している場合は、コマンドラインで入力してModelSpaceに切り替えることができます。これにより、いわばPSpaceの穴からMSpaceで作業できるようになります。したがって、PSpaceのレイアウトにMSpaceの内容全体が表示されていない場合は、MSpaceに切り替えて、コマンドラインで入力zまたは入力できます。zoomこれにより、ツールを使用してモデル空間内でユーザーが行うすべてのオプションzoom(All / Center / Dynamic ...)を使用できるようになります。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にコマンドを入力するだけで、プロンプトの順序と目的をメモし、それに応じてコードを記述します。プログラミングの知識がない多くの人がたどるルートであるマクロにアクションを記録する方法もあります。

頑張ってください〜

于 2013-01-18T07:59:25.183 に答える
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));
于 2013-04-12T18:46:11.893 に答える