Выбрать весь чертеж в AutoCAD без запроса пользователя

Я пытаюсь построить график, используя «Окно» как PlotType в AutoCad. Это код:

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. Я не хочу просить пользователя выбирать точки (в Интернете есть несколько примеров использования этого). Единственное, что я хочу, это чтобы переменные "first" и "second" стали Point3d. Первый должен быть левым верхним углом чертежа в ModelSpace, а второй должен быть правым нижним углом чертежа пространства модели. Как я мог это сделать? Есть ли какой-либо король конфигурации в PlotType (или что-то еще), который мог бы управлять всем этим для меня, то есть не запрашивать у пользователя выбранные углы и выбирать для меня весь чертеж в пространстве модели?


person Flávio Schuindt    schedule 17.01.2013    source источник
comment
Вы говорите, что вам нужно захватить верхний левый/нижний правый углы фактических линий квадрата, например, или углы активного окна?   -  person ChiefTwoPencils    schedule 18.01.2013
comment
Когда вы выбираете окно в Plot type в меню Plot внутри AutoCad, это дает вам возможность выбрать две точки. В моем случае мне нужно выбрать весь чертеж в пространстве модели (да, если вы попытаетесь сделать это в Autocad, вы можете выбрать чертеж квадратом), но я пытаюсь сделать это, не запрашивая пользователя и не позволяя ему вводить точки!   -  person Flávio Schuindt    schedule 18.01.2013


Ответы (2)


У меня нет опыта работы с C# и AutoCad. Я прошел обучение по AutoLISP. Но, зная, как работает AC, я бы сказал, что лучше всего взять под контроль командную строку как задокументировано здесь.

Судя по тому, что вы сказали, я предполагаю, что вы хотели бы напечатать то, что когда-либо находится в пространстве модели; это правильно?

Хорошо, когда вы находитесь в PaperSpace, вы можете переключиться на ModelSpace, набрав ._MSPACE в командной строке. Это позволит вам работать в MSpace, так сказать, через дыру в PSpace. Итак, если макет в 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, запишите порядок и назначение подсказок и кодируйте соответственно. Существует также способ записи действий в макрос, которым пользуются многие, не имеющие знаний в области программирования.

Удачи~

person ChiefTwoPencils    schedule 18.01.2013
comment
Я не знаю, как использовать AutoCAD как пользователь. Мне нужно автоматизировать задачу, которую пользователи выполняют снова и снова. Сама задача: Открыть несколько файлов, распечатать каждый в pdf. К настоящему времени я могу открыть несколько файлов и преобразовать каждый из них в pdf-файлы. Но в Plot есть некоторая конфигурация, которую я тоже хочу автоматизировать. Эти конфигурации заключаются в окне конфигурации Plot, чтобы выбрать Window и выбрать весь чертеж в пространстве модели (я думаю, что он может быть удален и в пространстве листа). Я хочу автоматически определить PlotWindowArea! - person Flávio Schuindt; 18.01.2013

Попробуй это.

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));
person Chuck Wilbur    schedule 12.04.2013