Jump to content

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

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

    29
  • Joined

  • Last visited

  • Days Won

    5

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

  1. 6 часов назад, doctorraz сказал:

    с чужой версией сразу эксепшен...

    ----------------

    ну и если писать под нано20-22

    то dynamic 

    все жэж работает с поздним связыванием и ничего не крашится если не закрывать документы

    нана20 на этом жэ коде при закрытии не падает

    более того прекрасно работает с либами от NC_SDK_22.0.5944.3726.6053

    22й нано это который зарелизен или в разработке?

    а попробуй 

    for (int i = 1; i < 20; i++)

     for (int i = 1; i < 20; i++)

    ---------

    на нескольких машинах проверил

    падает или виснет 6069 и 6122

    Да, после цикла падает nanoCAD.

    Попробуйте добавить внутри цикла Marshal.ReleaseComObject() для всех COM-объектов после их использования и docWork.Dispose() тоже в конце. У меня 22й nanoCAD перестал крашиться после этой доработки.

    • Like 1
    • Thanks 1
  2. Проверьте, чтобы к проекту VS была подключена правильная версия nanocad Type Library. У меня и CustomPlotSettings и CloseAndDiscard срабатывают как надо в 22й

  3. У меня получалось переключать сменой файла таблиц, как у вас в примере. Но я делала через 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();
       }

     

  4. В 22-м nanoCAD при смене принтера по-другому подхватывается формат бумаги, который был установлен до смены принтера. Попробуйте после смены принтера заново назначить нужный формат бумаги, тогда метод PlotToDevice() сработает, как надо

    • Like 1
    • Thanks 1
  5. 1182267522_3_780440.png.a56010e1bc835a5a0da2b600150756ad.png

    Расширенные настройки печати в nanoCAD являются дополнением к базовым настройкам.

    Через пользовательский интерфейс nanoCAD невозможно увидеть, какая настройка является базовой, а какая – расширенной, однако при работе с API nanoCAD разница видна четко. В качестве примера можно взять настройку выравнивания области печати на листе. Если бы существовала возможность использовать только базовую настройку, то область печати удавалось бы выровнять лишь по центру листа. Расширенная настройка позволяет выравнивать область печати не только по центру, но и по сторонам листа.

    В этой статье будут подробно рассмотрены настройки печати, которые относятся к расширенным, а также способы их изменения через API nanoCAD.

    https://habr.com/ru/company/nanosoft/blog/579360/

    • Like 2
    • Thanks 1
  6. 1180581352_4_780440.png.fcb947f57806fe69e1bdfb00021214c7.png

    В nanoCAD при настройке параметров печати необходимо выбрать область печати. Если оставить настройку по умолчанию, может быть напечатано совсем не то, что требовалось.

    В этой статье мы разберемся, как работать с областью печати через API nanoCAD.

    https://habr.com/ru/company/nanosoft/blog/579140/

    • Like 3
    • Thanks 1
  7. Из настроек принтеров в 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, но и картинки.

    • Like 1
  8. В 11.09.2021 в 15:51, doctorraz сказал:

    Комбо на лист второпях вытащить забыли? Или что...

    На листе он особо не нужен. Там ориентация бумаги меняется переключением Альбомный/Книжный, через API тот же эффект. С ног на голову чертеж в листе не повернуть, в отличие от пространства модели.

  9. 1380097475_2_780440.png.7a843d0bb616e12199a736b038e7b270.png

    При подготовке чертежа к печати необходимо настраивать большое количество параметров: принтер, формат бумаги, масштаб, область печати и т.д.

    В nanoCAD все необходимые для этого параметры объединены в наборы параметров листов. Однажды созданный набор можно применять в разных документах и разных листах, что позволит значительно сократить время подготовки документа к печати. В этой статье мы рассмотрим, как работать с наборами параметров листов через API nanoCAD.

    https://habr.com/ru/company/nanosoft/blog/565514/

    • Like 1
    • Thanks 2
  10. 56 минут назад, doctorraz сказал:

    Net Api к CustomPlotSettings (PlotAreas ) нет и не будет???

    Пока нет, будет ли - не могу однозначно ответить.

     

    57 минут назад, doctorraz сказал:

    PlotArea Add(object ptMin, object ptMax);

    Судя по названию точки на вход принимает???, но какие Point2d или Point3d, object  смущает...

    принимает массив double[] с двумя числами-координатами: первое - X, второе - Y. Координаты нужно преобразовывать в Display Coordinate System.

     

    35 минут назад, doctorraz сказал:

    В общем, как в лист программно дописать PlotArea?

    Был топик по областям печати, я выкладывала пример, как добавить "Рамку" и другие области печати программно через API nanoCAD:

     

    52 минуты назад, doctorraz сказал:

    Plot на вход принимает PlotSetting ??

    Если речь о nanoCAD.Plot и Teigha.DatabaseServices.PlotSettings, то - нет. У nanoCAD.Plot другой тип данных для наборов параметров: OdaX.IAcadPlotConfiguration. Он так просто не преобразовывается в PlotSettings..

     

    • Like 1
    • Thanks 1
  11. 22 часа назад, doctorraz сказал:

    Собственно вопрос, как этого избежать?

     

    Это из-за коллекции 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;
            }
        }
    

     

    22 часа назад, doctorraz сказал:

    как бы мы не крутили

    Что именно изменяется в модели и не видно на превью?

    • Like 1
    • Thanks 1
  12. 21 час назад, doctorraz сказал:

    psv.SetPlotConfigurationName(settings, plotterDevice, null);

    Обернуть в 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);
                }
            }
        }

     

    • Like 1
    • Thanks 1
  13. https://habr.com/ru/company/nanosoft/blog/564564/

    2126581415_1_780440_2.png.c2eabe3672f26d77631702d18183f33e.png

    Печать чертежей – это ответственный и трудоемкий процесс. Чертеж, напечатанный в неверном масштабе или с неверной толщиной линий может стать причиной ошибки производства, так как будет неверно прочитан. Порой на настройку параметров печати и саму печать уходит значимая часть рабочего времени. Поэтому многие проектировщики, знакомые с программированием, обращаются к программному интерфейсу САПР. Это хорошая возможность уменьшить влияние человеческого фактора и сократить время, которое приходится тратить на работу с чертежами.

    Этой статьей мы запускаем цикл статей, посвященный API печати nanoCAD, в котором будут ответы на традиционные вопросы начинающих САПР-программистов. Начнем с того, что разберемся, как программно отправить чертеж на печать.

    • Like 4
  14. 15 часов назад, doctorraz сказал:

    как нано сопоставляет бумагу портрет/ландшафт одного размера и настроек внутри себя?

    Бумага портрет/ландшафт одного размера сопоставляются по системному названию размера бумаги. У альбомной ориентации в системном названии всегда есть символы _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 минут
    18 часов назад, doctorraz сказал:

    и сделает все примитивы нулевой толщины..

    Любой plotrotation который не ноль.

    Просьба протестировать у себя мою команду, которая изменяет PlotRotation. У меня описанных проблем не возникает.

    SetPlotOrientation.cs

    • Like 1
  15. В 04.09.2021 в 19:28, doctorraz сказал:

    В принципе простой вопрос, как сменить книжную на альбомную

    image.png.383e209bfbbf1788d2de520b2f07f434.png

     

    При том, что SetPlotRotation  в нано работает совсем не так , как работает в оригинале...

     

    Через API ориентацию листа можно изменить через свойство CanonicalMediaName конкретного листа COM-документа nanoCAD.

    Свойство PlotRotation изменит книжный/альбомный только в листе, в пространстве модели оно изменит поворот области печати на листе, но на сам формат листа не повлияет. Прикрепляю пример на C#, как изменить формат листа через CanonicalMediaName. Эта команда изменит ориентацию листа одинаково и в пространстве модели и в листе

     

    SetPaperFormat.cs

    • Like 4
    • Thanks 1
  16. Тоже сталкивалась с таким предупреждением. У меня оно возникало, когда я пыталась добавить сразу несколько областей печати "Рамка" на лист. Если добавлять одну рамку методом setwindowtoplot, то все нормально работало. 

    Такая разница в поведении этого кода в nanoCAD и AutoCAD скорее всего связана с доработкой в nanoCAD, позволяющей добавлять несколько областей печати "Рамка" на один лист. Вот пример на С# по областям печати, может поможет. На 21м nanoCAD работает

    P.S. нужны библиотеки hostmgd.dll и ncauto.dll

     

    SetPlotArea.cs

    • Thanks 1
×
×
  • Create New...