Jump to content

Светлана Мирончик

Клуб разработчиков
  • Posts

    30
  • Joined

  • Last visited

  • Days Won

    5

Everything posted by Светлана Мирончик

  1. Здравствуйте! Это делается через таблицу блоков (BlockTable). Открываете лист для изменений, как запись таблицы блоков (BlockTableRecord) и добавляете туда объект, предварительно добавив его в базу данных чертежа. HostMgd.ApplicationServices.Document doc = HostMgd.ApplicationServices.Application.DocumentManager.CurrentDocument; // Получение ссылки на активный документ //HostMgd.ApplicationServices.Document doc = //HostMgd.ApplicationServices.Application.DocumentManager.MdiActiveDocument; // Получение ссылки на редактор докумена HostMgd.EditorInput.Editor ed = doc.Editor; // Получение ссылки на базу данных документа Teigha.DatabaseServices.Database db = doc.Database; // Начало транзакции с базой данных документа using (Teigha.DatabaseServices.Transaction trans = db.TransactionManager.StartTransaction()) { //Открываем словарь листов для поиска идентификатора листа Teigha.DatabaseServices.DBDictionary layoutsDict = trans.GetObject(db.LayoutDictionaryId, Teigha.DatabaseServices.OpenMode.ForRead) as Teigha.DatabaseServices.DBDictionary; Teigha.DatabaseServices.ObjectId layoutId = (Teigha.DatabaseServices.ObjectId)layoutsDict["A4"]; // Открываем таблицу блоков для изменения Teigha.DatabaseServices.BlockTable blockTable = trans.GetObject(db.BlockTableId, Teigha.DatabaseServices.OpenMode.ForRead) as Teigha.DatabaseServices.BlockTable; // Открываем лист для записи, чтобы добавить в него вставку блока Teigha.DatabaseServices.BlockTableRecord layoutBTR = trans.GetObject(layoutId, Teigha.DatabaseServices.OpenMode.ForWrite) as Teigha.DatabaseServices.BlockTableRecord; // Создаем объект Teigha.DatabaseServices.Line line = new Teigha.DatabaseServices.Line(); line.StartPoint = new Teigha.Geometry.Point3d(0, 0, 0); line.EndPoint = new Teigha.Geometry.Point3d(100, 100, 100); // Добавляем в базу данных и в лист trans.AddNewlyCreatedDBObject(line, true); layoutBTR.AppendEntity(line); // Перебираем все объекты листа foreach (var obj in layoutBTR) { Teigha.DatabaseServices.DBObject bObject = obj.GetObject(Teigha.DatabaseServices.OpenMode.ForRead); ed.WriteMessage($"Class {bObject.GetType()}, Handle {bObject.Handle}, ObjectId {bObject.ObjectId}"); } // Завершаем транзакцию trans.Commit(); }
  2. Да, после цикла падает nanoCAD. Попробуйте добавить внутри цикла Marshal.ReleaseComObject() для всех COM-объектов после их использования и docWork.Dispose() тоже в конце. У меня 22й nanoCAD перестал крашиться после этой доработки.
  3. Проверьте, чтобы к проекту VS была подключена правильная версия nanocad Type Library. У меня и CustomPlotSettings и CloseAndDiscard срабатывают как надо в 22й
  4. У меня получалось переключать сменой файла таблиц, как у вас в примере. Но я делала через PlotSettingsValidator и для этого способа нужно создавать набор параметров листа: private void ChangePlotStyleTable() { Document doc = Application.DocumentManager.MdiActiveDocument; Editor ed = doc.Editor; Database db = doc.Database; ObjectId CurrentSpaceId = db.CurrentSpaceId; // Использовать, если нужно добавлять объекты в текущий лист, вместо ModelSpace using (Transaction trans = db.TransactionManager.StartTransaction()) { DBDictionary pSettingsDict = trans.GetObject(db.PlotSettingsDictionaryId, OpenMode.ForWrite) as DBDictionary; LayoutManager layoutMngr = LayoutManager.Current; Layout currentLayout = trans.GetObject(layoutMngr.GetLayoutId(layoutMngr.CurrentLayout), OpenMode.ForWrite) as Layout; PlotSettings pSettings = default(PlotSettings); if(!pSettingsDict.Contains("PlotSettings1")) { pSettings = new PlotSettings(currentLayout.ModelType); pSettings.CopyFrom(currentLayout); pSettings.PlotSettingsName = "PlotSettings1"; pSettings.AddToPlotSettingsDictionary(db); trans.AddNewlyCreatedDBObject(pSettings,true); } else { pSettings = pSettingsDict.GetAt("PlotSettings1").GetObject(OpenMode.ForWrite) as PlotSettings; } PlotSettingsValidator validator = PlotSettingsValidator.Current; validator.SetCurrentStyleSheet(pSettings, "ncad.stb"); currentLayout.CopyFrom(pSettings); currentLayout.UpgradeOpen(); trans.Commit(); } doc.Editor.Regen(); }
  5. В 22-м nanoCAD при смене принтера по-другому подхватывается формат бумаги, который был установлен до смены принтера. Попробуйте после смены принтера заново назначить нужный формат бумаги, тогда метод PlotToDevice() сработает, как надо
  6. Расширенные настройки печати в nanoCAD являются дополнением к базовым настройкам. Через пользовательский интерфейс nanoCAD невозможно увидеть, какая настройка является базовой, а какая – расширенной, однако при работе с API nanoCAD разница видна четко. В качестве примера можно взять настройку выравнивания области печати на листе. Если бы существовала возможность использовать только базовую настройку, то область печати удавалось бы выровнять лишь по центру листа. Расширенная настройка позволяет выравнивать область печати не только по центру, но и по сторонам листа. В этой статье будут подробно рассмотрены настройки печати, которые относятся к расширенным, а также способы их изменения через API nanoCAD. https://habr.com/ru/company/nanosoft/blog/579360/
  7. Эта коллекция входит в CustomPlotSettings, о ней будет упомянуто в следующей статье
  8. В nanoCAD при настройке параметров печати необходимо выбрать область печати. Если оставить настройку по умолчанию, может быть напечатано совсем не то, что требовалось. В этой статье мы разберемся, как работать с областью печати через API nanoCAD. https://habr.com/ru/company/nanosoft/blog/579140/
  9. Из настроек принтеров в API только "общие" настройки, которые встречаются у всех встроенных принтеров. Первыми двумя через API нельзя управлять и системными переменными тоже, только через UI. Последняя галочка - это свойство RunPDFApp в CustomPlotSettings: HostMgd.ApplicationServices.Document doc = HostMgd.ApplicationServices.Application.DocumentManager.MdiActiveDocument; nanoCAD.Document comDoc = doc.AcadDocument as nanoCAD.Document; OdaX.IAcadLayout activeLayout = comDoc.ActiveLayout; nanoCAD.Plot plot = (nanoCAD.Plot)comDoc.Plot; nanoCAD.InanoCADPlotCustomParams customPlotSettings = plot.CustomPlotSettings[activeLayout]; customPlotSettings.RunPDFApp = true; plot.CustomPlotSettings[activeLayout]=customPlotSettings; Запустит не только просмотр pdf, но и картинки.
  10. На листе он особо не нужен. Там ориентация бумаги меняется переключением Альбомный/Книжный, через API тот же эффект. С ног на голову чертеж в листе не повернуть, в отличие от пространства модели.
  11. Alignment относится к CustomPlotSettings, будет отдельная статья по этим настройкам
  12. При подготовке чертежа к печати необходимо настраивать большое количество параметров: принтер, формат бумаги, масштаб, область печати и т.д. В nanoCAD все необходимые для этого параметры объединены в наборы параметров листов. Однажды созданный набор можно применять в разных документах и разных листах, что позволит значительно сократить время подготовки документа к печати. В этой статье мы рассмотрим, как работать с наборами параметров листов через API nanoCAD. https://habr.com/ru/company/nanosoft/blog/565514/
  13. Пока нет, будет ли - не могу однозначно ответить. принимает массив double[] с двумя числами-координатами: первое - X, второе - Y. Координаты нужно преобразовывать в Display Coordinate System. Был топик по областям печати, я выкладывала пример, как добавить "Рамку" и другие области печати программно через API nanoCAD: Если речь о nanoCAD.Plot и Teigha.DatabaseServices.PlotSettings, то - нет. У nanoCAD.Plot другой тип данных для наборов параметров: OdaX.IAcadPlotConfiguration. Он так просто не преобразовывается в PlotSettings..
  14. Это из-за коллекции PlotAreas. Нужно ее очистить в CustomPlotSettings перед тем, как копировать в лист новые настройки области печати. Через COM: private void CleanPlotAreas() { HostMgd.ApplicationServices.Document doc = HostMgd.ApplicationServices.Application.DocumentManager.MdiActiveDocument; nanoCAD.Document comDoc = doc.AcadDocument as nanoCAD.Document; nanoCAD.Plot plot = (nanoCAD.Plot)comDoc.Plot; foreach (OdaX.IAcadLayout layout in comDoc.Layouts) { nanoCAD.InanoCADPlotCustomParams customPlotSettings = plot.CustomPlotSettings[layout]; customPlotSettings.PlotAreas.Clear(); plot.CustomPlotSettings[layout] = customPlotSettings; } } Что именно изменяется в модели и не видно на превью?
  15. Обернуть в try-catch, тогда не будет стопориться на этой ошибке и в конце выдаст все форматы бумаги pdf-принтеров Еще такой код сработает без ошибок с тем же результатом: [Teigha.Runtime.CommandMethod("GetCanonicalNames")] public void GetPDFPlotters() { //Получение ссылки на активный документ HostMgd.ApplicationServices.Document doc = HostMgd.ApplicationServices.Application.DocumentManager.MdiActiveDocument; nanoCAD.Document comDoc = doc.AcadDocument as nanoCAD.Document; //Получение ссылки на редактор активного документа HostMgd.EditorInput.Editor ed = doc.Editor; //Получение ссылки на активный лист документа OdaX.IAcadLayout activeLayout = comDoc.ActiveLayout; //Получение списка доступных принтеров List<string> printers = new List<string>(comDoc.ActiveLayout.GetPlotDeviceNames()); foreach(string p in printers) { if (p.Contains("PDF")) { ed.WriteMessage("\nПлоттер: \'{0}\'", p); activeLayout.ConfigName = p; foreach (string cmn in activeLayout.GetCanonicalMediaNames()) ed.WriteMessage("\n Каноническое имя: \'{0}\'", cmn); } } }
  16. https://habr.com/ru/company/nanosoft/blog/564564/ Печать чертежей – это ответственный и трудоемкий процесс. Чертеж, напечатанный в неверном масштабе или с неверной толщиной линий может стать причиной ошибки производства, так как будет неверно прочитан. Порой на настройку параметров печати и саму печать уходит значимая часть рабочего времени. Поэтому многие проектировщики, знакомые с программированием, обращаются к программному интерфейсу САПР. Это хорошая возможность уменьшить влияние человеческого фактора и сократить время, которое приходится тратить на работу с чертежами. Этой статьей мы запускаем цикл статей, посвященный API печати nanoCAD, в котором будут ответы на традиционные вопросы начинающих САПР-программистов. Начнем с того, что разберемся, как программно отправить чертеж на печать.
  17. Бумага портрет/ландшафт одного размера сопоставляются по системному названию размера бумаги. У альбомной ориентации в системном названии всегда есть символы _L, например Letter_(8.50_x_11.00_Inches) - книжный Letter_(8.50_x_11.00_Inches)_L - альбомный Возможны другие интерпретации, в зависимости от выбранного принтера, например, может быть (Альбомная)_L или _L_L, или _L6 Для того, чтобы изменить ориентацию бумаги одного размера, в API отдельного метода не предусмотрено. Для решения этой задачи нужно оперировать содержимым свойства CanonicalMediaName и пользоваться поиском в коллекции форматов бумаги, доступных при текущих настройках листа. Коллекцию можно получить методом GetCanonicalMediaNames() (возвращает массив строк) нужного листа COM-документа nanoCAD. добавлено через 9 минут Просьба протестировать у себя мою команду, которая изменяет PlotRotation. У меня описанных проблем не возникает. SetPlotOrientation.cs
  18. Через API ориентацию листа можно изменить через свойство CanonicalMediaName конкретного листа COM-документа nanoCAD. Свойство PlotRotation изменит книжный/альбомный только в листе, в пространстве модели оно изменит поворот области печати на листе, но на сам формат листа не повлияет. Прикрепляю пример на C#, как изменить формат листа через CanonicalMediaName. Эта команда изменит ориентацию листа одинаково и в пространстве модели и в листе SetPaperFormat.cs
  19. Тоже сталкивалась с таким предупреждением. У меня оно возникало, когда я пыталась добавить сразу несколько областей печати "Рамка" на лист. Если добавлять одну рамку методом setwindowtoplot, то все нормально работало. Такая разница в поведении этого кода в nanoCAD и AutoCAD скорее всего связана с доработкой в nanoCAD, позволяющей добавлять несколько областей печати "Рамка" на один лист. Вот пример на С# по областям печати, может поможет. На 21м nanoCAD работает P.S. нужны библиотеки hostmgd.dll и ncauto.dll SetPlotArea.cs
×
×
  • Create New...