Последние сообщения

Последние сообщения

Страницы: [1] 2 3 ... 10
1
AutoCAD .NET API / Re: Ошибка печати при экспорте в Pdf
« Последний ответ от Alexandr1993 22-11-2024, 12:12:03 »
Добрый день! Полностью подтверждаю описанную выше проблему. Программа исправно отрабатывает при нескольких вариантах:
1. Все листы имеют одинаковый формат (CanonicalMediaName) и ориентацию (PlotRotation)
2. Всем листам (независимо от их фактических параметров, указанных выше) назначать эти параметры одинаковыми.


Код программы:
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.PlottingServices;
  5. using Autodesk.AutoCAD.Publishing;
  6. using Autodesk.AutoCAD.Runtime;
  7.  
  8.  
  9. [CommandMethod("mplot")]
  10.         static public void MultiSheetPlot()
  11.         {
  12.             Document doc = Application.DocumentManager.MdiActiveDocument;
  13.             using (doc.LockDocument())
  14.             {
  15.                 Editor ed = doc.Editor;
  16.                 Database db = doc.Database;
  17.  
  18.  
  19.                 Transaction trans = db.TransactionManager.StartTransaction();
  20.  
  21.                 using (trans)
  22.                 {
  23.                     BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
  24.                  
  25.                     // A PlotEngine does the actual plotting
  26.                     // (can also create one for Preview)
  27.  
  28.                     if (PlotFactory.ProcessPlotState == ProcessPlotState.NotPlotting)
  29.                     {
  30.                         PlotEngine plotengine = PlotFactory.CreatePublishEngine();
  31.                         using (plotengine)
  32.                         {
  33.                             ObjectIdCollection layoutsToPlot = new ObjectIdCollection();
  34.                             List<Layout> listlayout = new List<Layout>();
  35.                             DBDictionary layoutdic= (DBDictionary)db.LayoutDictionaryId.GetObject(OpenMode.ForRead);
  36.  
  37.                             // Create a Progress Dialog to provide info
  38.                             // and allow thej user to cancel
  39.  
  40.                             foreach (DBDictionaryEntry entry in layoutdic)
  41.                             {
  42.                                 if (entry.Key != "Model")
  43.                                     listlayout.Add((Layout)trans.GetObject(entry.Value, OpenMode.ForRead));
  44.                             }
  45.                             listlayout.Sort((l1, l2) => l1.TabOrder.CompareTo(l2.TabOrder));
  46.                             layoutsToPlot = new ObjectIdCollection(listlayout.Select(l => l.BlockTableRecordId).ToArray());
  47.  
  48.                             PlotProgressDialog plotprogressdialog = new PlotProgressDialog(false, layoutsToPlot.Count, true);
  49.  
  50.                             using (plotprogressdialog)
  51.                             {
  52.                                 //ObjectIdCollection layoutsToPlot = new ObjectIdCollection();
  53.  
  54.                                 int numSheet = 1;
  55.  
  56.                                 foreach (ObjectId btrId in layoutsToPlot)
  57.                                 {
  58.                                     PlotInfo plotinfo = new PlotInfo();
  59.                                     PlotInfoValidator piv = new PlotInfoValidator();
  60.  
  61.                                     piv.MediaMatchingPolicy = MatchingPolicy.MatchEnabledCustom;
  62.                                     BlockTableRecord btr = (BlockTableRecord)trans.GetObject(btrId, OpenMode.ForRead);
  63.  
  64.                                     Layout lo = (Layout)trans.GetObject(btr.LayoutId, OpenMode.ForRead);
  65.  
  66.                                     // We need a PlotSettings object
  67.                                     // based on the layout settings
  68.                                     // which we then customize
  69.  
  70.  
  71.                                     PlotSettings plotset = new PlotSettings(lo.ModelType);
  72.  
  73.                                     plotset.CopyFrom(lo);
  74.                                    
  75.                                     // The PlotSettingsValidator helps
  76.                                     // create a valid PlotSettings object
  77.  
  78.  
  79.                                     PlotSettingsValidator plotsetvalid = PlotSettingsValidator.Current;
  80.  
  81.  
  82.                                     // We'll plot the extents, centered and
  83.                                     // scaled to fit
  84.  
  85.  
  86.                                     plotsetvalid.SetPlotType(plotset, Autodesk.AutoCAD.DatabaseServices.PlotType.Layout);
  87.                                     plotsetvalid.SetUseStandardScale(plotset, true);                                  
  88.                                     plotsetvalid.SetStdScaleType(plotset, StdScaleType.StdScale1To1);
  89.                                                                        
  90.                                     // We'll use the standard DWFx PC3, as
  91.                                     // this supports multiple sheets
  92.  
  93.                                     try
  94.                                     {
  95.                                         plotsetvalid.SetPlotConfigurationName(plotset, "DWG To PDF.pc3", lo.CanonicalMediaName);
  96.                                     }
  97.                                     catch (System.Exception)
  98.                                     {
  99.  
  100.                                         System.Windows.MessageBox.Show("Для листа " + lo.LayoutName.ToUpper() + " не удалось определить формат листа и назначить ему настройки печати." +
  101.                                             "\n Принтер должен быть DWG to PDF.pc3" +
  102.                                            "\n " + lo.CanonicalMediaName +
  103.                                             "\n Обратитесь в поддержку.", "ERROR", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error);
  104.                                         return;
  105.                                     }
  106.  
  107.                                     // We need a PlotInfo object
  108.                                     // linked to the layout
  109.  
  110.                                     // Make the layout we're plotting current
  111.                                     LayoutManager.Current.CurrentLayout = lo.LayoutName;
  112.                                    
  113.                                     // We need to link the PlotInfo to the
  114.                                     // PlotSettings and then validate it
  115.                                     plotinfo.OverrideSettings = plotset;
  116.                                     plotinfo.Layout = btr.LayoutId;
  117.                                     piv.Validate(plotinfo);
  118.                                    
  119.  
  120.                                     if (numSheet == 1)
  121.                                     {
  122.                                         plotprogressdialog.set_PlotMsgString(PlotMessageIndex.DialogTitle, "Custom Plot Progress");
  123.  
  124.                                         plotprogressdialog.set_PlotMsgString(PlotMessageIndex.CancelJobButtonMessage, "Cancel Job");
  125.  
  126.                                         plotprogressdialog.set_PlotMsgString(PlotMessageIndex.CancelSheetButtonMessage, "Cancel Sheet");
  127.  
  128.                                         plotprogressdialog.set_PlotMsgString(PlotMessageIndex.SheetSetProgressCaption, "Sheet Set Progress");
  129.  
  130.                                         plotprogressdialog.set_PlotMsgString(PlotMessageIndex.SheetProgressCaption, "Sheet Progress");
  131.  
  132.                                         plotprogressdialog.LowerPlotProgressRange = 0;
  133.  
  134.                                         plotprogressdialog.UpperPlotProgressRange = 100;
  135.  
  136.                                         plotprogressdialog.PlotProgressPos = 0;
  137.  
  138.  
  139.                                         // Let's start the plot, at last
  140.  
  141.  
  142.                                         plotprogressdialog.OnBeginPlot();
  143.  
  144.                                         plotprogressdialog.IsVisible = true;
  145.  
  146.                                         plotengine.BeginPlot(plotprogressdialog, null);
  147.  
  148.  
  149.                                         // We'll be plotting a single document
  150.  
  151.                                         plotengine.BeginDocument(plotinfo, doc.Name, null, 1, true, doc.Name.Replace("dwg", "PDF"));
  152.                                     }
  153.  
  154.  
  155.                                     // Which may contain multiple sheets
  156.  
  157.  
  158.                                     plotprogressdialog.StatusMsgString = "Plotting " + doc.Name.Substring(doc.Name.LastIndexOf("\\") + 1) + " - sheet " + numSheet.ToString() +
  159.  
  160.                                       " of " + layoutsToPlot.Count.ToString();
  161.  
  162.  
  163.                                     plotprogressdialog.OnBeginSheet();
  164.  
  165.  
  166.                                     plotprogressdialog.LowerSheetProgressRange = 0;
  167.  
  168.                                     plotprogressdialog.UpperSheetProgressRange = 100;
  169.  
  170.                                     plotprogressdialog.SheetProgressPos = 0;
  171.  
  172.  
  173.                                     PlotPageInfo plotpageinfo = new PlotPageInfo();
  174.                                     try
  175.                                     {
  176.                                         plotengine.BeginPage(plotpageinfo, plotinfo, numSheet == layoutsToPlot.Count, null);
  177.                                     }
  178.                                     catch (System.Exception)
  179.                                     {
  180.                                         System.Windows.MessageBox.Show("Ошибки с настройкой листа " + lo.LayoutName.ToUpper() + " при печати. Обратитесь в поддержку.", "ERROR",
  181.                                             System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error);
  182.                                         return;
  183.                                     }
  184.  
  185.  
  186.                                     plotengine.BeginGenerateGraphics(null);
  187.  
  188.                                     plotprogressdialog.SheetProgressPos = 50;
  189.  
  190.                                     plotengine.EndGenerateGraphics(null);
  191.  
  192.  
  193.                                     // Finish the sheet
  194.  
  195.                                     plotengine.EndPage(null);
  196.  
  197.                                     plotprogressdialog.SheetProgressPos = 100;
  198.  
  199.                                     plotprogressdialog.OnEndSheet();
  200.  
  201.                                     numSheet++;
  202.                                 }
  203.  
  204.                                 // Finish the document
  205.  
  206.                                 plotengine.EndDocument(null);
  207.  
  208.                                 // And finish the plot
  209.  
  210.                                 plotprogressdialog.PlotProgressPos = 100;
  211.  
  212.                                 plotprogressdialog.OnEndPlot();
  213.  
  214.                                 plotengine.EndPlot(null);
  215.                             }
  216.                         }
  217.                     }
  218.                     else
  219.                     {
  220.                         ed.WriteMessage("\nAnother plot is in progress.");
  221.                     }
  222.                     trans.Commit();
  223.                 }
  224.  
  225.             }
  226.         }

Чертёж для теста и настроенные файлы PC3 и PMP прилагаю.
Мои попытки пробить эту стену в течение 2-х дней ни к чему не привели.
2
Здравствуйте, у меня есть собственный динамический блок, прикрепленный к некоторым ручкам (захватам). При нажатии на один из этих дескрипторов появляется контекстное меню, содержащее настраиваемый список CanonicalMediaNames. Есть ли способ использовать код C# в AutoCAD для доступа к контекстному меню ручки в динамическом блоке, получения списка CanonicalMediaNames, обработки события, которое выбирает элемент в списке, и применения выбранного CanonicalMediaName к настройкам текущего макета? Благодарить.
3
AutoCAD .NET API / Re: GitHub Copilot для AutoCAD.Net
« Последний ответ от Валерий Ивлев 11-11-2024, 15:00:01 »
Я пробовал помучить бесплатный ChatGPT
Как я знаю, для первые пяти (могу ошибаться) запросов он использует GPT-4o "omni" которая довольно сносно отвечает. Конечно часто и галюцинирует, но все зависит от правильного запроса. Лучше спрашивать по-английски.
4
AutoCAD .NET API / Re: GitHub Copilot для AutoCAD.Net
« Последний ответ от Lemieux 08-11-2024, 19:45:49 »
Опыта нет.
А Вы думали, что ChatGPT это сверхразум? Его просто натаскали на бекэнд и фронтэнд, и стали везде рекламировать. Я думаю не надо объяснять почему его натаскивали именно на такой тип работы. Опять же, какие тесты? Вы попробуйте напишите тесты к бекэнду где крутят круды и тесты к плагину AutoCAD, где ещё навороченный интерфейс на WPF.
В специфике написания различных плагинов к *CAD, САПР, нет альтернативы как писать самому.
5
AutoCAD .NET API / GitHub Copilot для AutoCAD.Net
« Последний ответ от avc 08-11-2024, 08:04:13 »
Есть ли у кого-нибудь опыт использования Copilot для помощи в создании C#-кода плагинов? Есть ли смысл за него платить 100$ в год? (Бесплатной версии похоже нет?) Есть ли рекомендации/статьи как лучше к нему обращаться, где полезно задействовать?
Судя по его рекламе там все про корпоративную разработку и автоматизацию тестов, то есть то, что вообще не нужно программисту-одиночке.
Я пробовал помучить бесплатный ChatGPT - опыт довольно сомнительный, API AutoCAD он не знает и фантазирует что попало. Но все же иногда получается применить его код после переписывания под реальные методы из API. Зато понимает по-русски.
6
Мы проверяли перед вопросом. Но сейчас сделали еще серию тестов - нет, PICKBOX не влияет на чувствительность.
Еще проверяли APERTURE и даже HPGAPTOL и GRIDUNIT. Тоже нет.

От настроения и погоды результаты вдруг могут быть хорошими. Но при повторных попытках и в других случаях могут не повторяться.

Наверное, не случайно, что в AutoCAD при _SELECT _WP или _CP отключается привязка - чтобы пользователь думал, что неполнота выбранного от его неметкости. А в nanoCAD при _SELECT _WP или _CP привязка не только отключается, но и делается недоступной.
И, наверное, не случайно же с _WP выбирается только то, что не касается, не примыкает к контуру выбора.
Т.е. производители ПО об этой низкой чувствительности команды и функций знают, и так ее замыливают.

Функции ssget и vla-selectbypolygon имеют одинаковую, такую же чувствительность, что у _SELECT.
7
М.б., играет роль размер "прицела"?
8
Разное / Выбор объектов относительно контуров
« Последний ответ от АлексЮстасу 31-10-2024, 03:48:48 »
Штатный в AutoCAD SELECT с опцией WP (РМн-угол) действует не точно, не полно.
Если многоугольник выбора отстоит от вершин объекта меньше, чем на 0.001, то такой полностью попадающий в многоугольник объект может быть не выбран.
А может быть выбран. Возможно, это зависит от угла сегмента многоугольника, может, от других причин.
Но сам выбор с SELECT не полон или полнота выбора этим средством непредсказуема.

Абсолютные размеры объектов не влияют - пробовал на объектах-четырехугольниках со сторонами 1000 ед и 0.1 ед.
LUPREC, точность линейных единиц не влияет. Пробовал и с 0.00, и с 0.0000, и с 0.00000000.

Кроме того, SELECT с опцией WP может вообще не действовать или выбрать не все соответствующее, если многоугольник выбора не весь на экране.
В целом случай с SELECT оч. похож на случай с BOUNDARY - такой же неточной, неполной, зависящей от положения на экране.

Соответственно, программы использующие этот SELECT, ненадежны. Есть качественные альтернативы выбора относительно контуров?

9
AutoCAD .NET API / Re: Оффтопик. Изучаем C#
« Последний ответ от Валерий Ивлев 22-10-2024, 08:47:56 »
Спасибо за ответ.
Для автоматизации копирования dll в bundle и Resources использовал Properties\Post-build event command line:

xcopy /Y "$(TargetPath)" "%AppData%\Autodesk\ApplicationPlugins\XXX.bundle\Contents\"
xcopy /E /I /Y "$(ProjectDir)Resources" "$(TargetDir)Resources"
xcopy /E /I /Y "$(ProjectDir)Resources" "%AppData%\Autodesk\ApplicationPlugins\XXX.bundle\Contents\Resources"
xcopy /Y "$(TargetPath)" "c:\Autodesk\C#\XXX.bundle\Contents\"
xcopy /E /I /Y "$(ProjectDir)Resources" "c:\Autodesk\C#\XXX.bundle\Contents\Resources"

1 строка обновляет dll в рабочей папке bundle
2, 3 строки обновляют папку Resources в каталоге сборки и в рабочей папки bundle
4, 5 строки обновляют проект для локального хранилища

Папка Resources залетает на GitHub автоматически
10
Здравствуйте, подскажите как проверять записалось или нет что нибудь в pc3 и pmp файлы?
Взял код отсюда https://adn-cis.org/forum/index.php?topic=9826.msg43802#msg43802 пользуюсь методами ChangePc3 и ChangePmp. Файлы тхт , pc3  и pmp появляются, но как их увидеть в autocad? Делаю Attach в файл pc3, pmp, но ничего нового не появляется в списке? Правильно ли я все делаю, как добавлять нестандартные форматы?
Страницы: [1] 2 3 ... 10