Публикация содержимого Database без открытия Document

Автор Тема: Публикация содержимого Database без открытия Document  (Прочитано 8072 раз)

0 Пользователей и 3 Гостей просматривают эту тему.

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
* AutoCAD 2009 x86 SP3 Enu
* AutoCAD 2015 x86 Enu
Выполняю публикацию в PDF всех регионов, находящихся в DWG файле, указанном пользователем.

В идеале публикация должна осуществляться с использованием только Database, БЕЗ открытия Document. Однако в этом случае результат публикации выглядит весьма странно:

1. Печать не цветная.
2. Часть распечатываемой информации отсутствует.

Ниже прикреплены результаты публикации в PDF с использованием Document и без его использования. Там же выложен исходный DWG файл, на примере которого тестировался код.

Далее исходный код. При вызове команды PlotToPDF откроется окошко, в котором следует указать выложенный мною DWG файл. Далее будет вопрос на тему того, как выполнять публикацию: печатать не создавая Document, или же открыть Document и выполнить печать.

Примечание: при компиляции кода не забываем определять символы AUTOCAD_NEWER_THAN_2012 и AUTOCAD_NEWER_THAN_2014 в случае таковой необходимости (зависит от версии AutoCAD).

Код - C# [Выбрать]
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Runtime.InteropServices;
  6. using System.Windows;
  7.  
  8. using cad = Autodesk.AutoCAD.ApplicationServices.Application;
  9. using Ap = Autodesk.AutoCAD.ApplicationServices;
  10. using Db = Autodesk.AutoCAD.DatabaseServices;
  11. using Ed = Autodesk.AutoCAD.EditorInput;
  12. using Rt = Autodesk.AutoCAD.Runtime;
  13. using Gm = Autodesk.AutoCAD.Geometry;
  14. using Wn = Autodesk.AutoCAD.Windows;
  15. using Hs = Autodesk.AutoCAD.DatabaseServices.HostApplicationServices;
  16. using Us = Autodesk.AutoCAD.DatabaseServices.SymbolUtilityServices;
  17. using Br = Autodesk.AutoCAD.BoundaryRepresentation;
  18. using Pt = Autodesk.AutoCAD.PlottingServices;
  19.  
  20. // для возможности использования методов расширений
  21. using Autodesk.AutoCAD.ApplicationServices;
  22. using Bushman.CAD.Extensions;
  23.  
  24. [assembly: Rt.CommandClass(typeof(Bushman.CAD.Commands.PlotProblem))]
  25.  
  26. namespace Bushman.CAD.Commands {
  27.  
  28.   public sealed class PlotProblem {
  29.  
  30. #if AUTOCAD_NEWER_THAN_2012
  31.     const String acedTransOwner = "accore.dll";
  32. #else
  33.     const String acedTransOwner = "acad.exe";
  34. #endif
  35.  
  36. #if AUTOCAD_NEWER_THAN_2014
  37.     const String acedTrans_x86_Prefix = "_";
  38. #else
  39.     const String acedTrans_x86_Prefix = "";
  40. #endif
  41.  
  42.     const String acedTransName = "acedTrans";
  43.  
  44.     [DllImport(acedTransOwner, CallingConvention = CallingConvention.Cdecl,
  45.             EntryPoint = acedTrans_x86_Prefix + acedTransName)]
  46.     static extern Int32 acedTrans_x86(Double[] point, IntPtr fromRb,
  47.       IntPtr toRb, Int32 disp, Double[] result);
  48.  
  49.     [DllImport(acedTransOwner, CallingConvention = CallingConvention.Cdecl,
  50.             EntryPoint = acedTransName)]
  51.     static extern Int32 acedTrans_x64(Double[] point, IntPtr fromRb,
  52.       IntPtr toRb, Int32 disp, Double[] result);
  53.  
  54.     internal static Int32 acedTrans(Double[] point, IntPtr fromRb, IntPtr toRb,
  55.       Int32 disp, Double[] result) {
  56.       if(IntPtr.Size == 4)
  57.         return acedTrans_x86(point, fromRb, toRb, disp, result);
  58.       else
  59.         return acedTrans_x64(point, fromRb, toRb, disp, result);
  60.     }
  61.  
  62.     /// <summary>
  63.     /// Печать объектов базы данных согласно указанным границам печати
  64.     /// (Window).
  65.     /// </summary>
  66.     /// <param name="db">База данных, объекты которой подлежат публикации.
  67.     /// </param>
  68.     /// <param name="bottomLeft">Левый нижний угол границы печати.
  69.     /// </param>
  70.     /// <param name="topRight">Правый верхний угол границы печати.
  71.     /// </param>
  72.     /// <param name="pcsFileName">Наименование PC3 файла</param>
  73.     /// <param name="mediaName">Наименование выбранного формата листа</param>
  74.     /// <param name="outputFileName">Имя файла, в котором сохраняется результат
  75.     /// печати.</param>
  76.     public static void PlotRegion(Db.Database db, Gm.Point2d bottomLeft,
  77.       Gm.Point2d topRight, String pcsFileName, String mediaName,
  78.       String outputFileName, String dwgFileName) {
  79.       Ed.Editor ed = cad.DocumentManager.MdiActiveDocument.Editor;
  80.       try {
  81.         if(db == null)
  82.           throw new ArgumentNullException("db");
  83.         if(db.IsDisposed)
  84.           throw new ArgumentException("db.IsDisposed == true");
  85.         if(pcsFileName == null)
  86.           throw new ArgumentNullException("pcsFileName");
  87.         if(pcsFileName.Trim() == String.Empty)
  88.           throw new ArgumentException("pcsFileName.Trim() == String.Empty");
  89.  
  90.         if(mediaName == null)
  91.           throw new ArgumentNullException("mediaName");
  92.         if(mediaName.Trim() == String.Empty)
  93.           throw new ArgumentException("mediaName.Trim() == String.Empty");
  94.  
  95.         if(outputFileName == null)
  96.           throw new ArgumentNullException("outputFileName");
  97.         if(outputFileName.Trim() == String.Empty)
  98.           throw new ArgumentException("outputFileName.Trim() == String.Empty");
  99.  
  100.         using(Db.Transaction tr = db.TransactionManager.StartTransaction()) {
  101.  
  102.           Db.ObjectId modelId = Us.GetBlockModelSpaceId(db);
  103.           Db.BlockTableRecord model = tr.GetObject(modelId,
  104.           Db.OpenMode.ForRead) as Db.BlockTableRecord;
  105.  
  106.           Db.Layout layout = tr.GetObject(model.LayoutId,
  107.           Db.OpenMode.ForRead) as Db.Layout;
  108.  
  109.           using(Pt.PlotInfo pi = new Pt.PlotInfo()) {
  110.             pi.Layout = model.LayoutId;
  111.  
  112.             using(Db.PlotSettings ps = new Db.PlotSettings(layout.ModelType)
  113.               ) {
  114.  
  115.               ps.CopyFrom(layout);
  116.  
  117.               Db.PlotSettingsValidator psv = Db.PlotSettingsValidator
  118.                 .Current;
  119.  
  120.               Gm.Point3d bottomLeft_3d = new Gm.Point3d(bottomLeft.X,
  121.                 bottomLeft.Y, 0);
  122.               Gm.Point3d topRight_3d = new Gm.Point3d(topRight.X, topRight.Y,
  123.                 0);
  124.  
  125.               Db.ResultBuffer rbFrom = new Db.ResultBuffer(new Db.TypedValue(
  126.                 5003, 1));
  127.               Db.ResultBuffer rbTo = new Db.ResultBuffer(new Db.TypedValue(
  128.                 5003, 2));
  129.  
  130.               double[] firres = new double[] { 0, 0, 0 };
  131.               double[] secres = new double[] { 0, 0, 0 };
  132.  
  133.               acedTrans(bottomLeft_3d.ToArray(), rbFrom.UnmanagedObject,
  134.                 rbTo.UnmanagedObject, 0, firres);
  135.               acedTrans(topRight_3d.ToArray(), rbFrom.UnmanagedObject,
  136.                 rbTo.UnmanagedObject, 0, secres);
  137.  
  138.               Db.Extents2d extents = new Db.Extents2d(
  139.                   firres[0],
  140.                   firres[1],
  141.                   secres[0],
  142.                   secres[1]
  143.                 );
  144.  
  145.               psv.SetZoomToPaperOnUpdate(ps, true);
  146.  
  147.               // Прежде чем методу SetPlotType присвоить в качестве второго
  148.               // параметра значение PlotType.Window, необходимо вызвать метод
  149.               // SetPlotWindowArea, указав через него границы Window.
  150.               // В противном случае возникнет runtime error.
  151.               psv.SetPlotWindowArea(ps, extents);
  152.               psv.SetPlotType(ps, Db.PlotType.Window);
  153.               psv.SetUseStandardScale(ps, true);
  154.               psv.SetStdScaleType(ps, Db.StdScaleType.ScaleToFit);
  155.               psv.SetPlotCentered(ps, true);
  156.               psv.SetPlotRotation(ps, Db.PlotRotation.Degrees000);
  157.  
  158.               // We'll use the standard DWF PC3, as
  159.               // for today we're just plotting to file
  160.               psv.SetPlotConfigurationName(ps, pcsFileName, mediaName);
  161.  
  162.               // We need to link the PlotInfo to the
  163.               // PlotSettings and then validate it
  164.               pi.OverrideSettings = ps;
  165.               Pt.PlotInfoValidator piv = new Pt.PlotInfoValidator();
  166.               piv.MediaMatchingPolicy = Pt.MatchingPolicy.MatchEnabled;
  167.               piv.Validate(pi);
  168.  
  169.               // A PlotEngine does the actual plotting
  170.               // (can also create one for Preview)
  171.               if(Pt.PlotFactory.ProcessPlotState == Pt.ProcessPlotState
  172.                 .NotPlotting) {
  173.                 using(Pt.PlotEngine pe = Pt.PlotFactory.CreatePublishEngine()
  174.                   ) {
  175.                   // Create a Progress Dialog to provide info
  176.                   // and allow thej user to cancel
  177.  
  178.                   using(Pt.PlotProgressDialog ppd =
  179.                     new Pt.PlotProgressDialog(false, 1, true)) {
  180.                     ppd.set_PlotMsgString(
  181.                     Pt.PlotMessageIndex.DialogTitle, "Custom Plot Progress");
  182.  
  183.                     ppd.set_PlotMsgString(
  184.                       Pt.PlotMessageIndex.CancelJobButtonMessage,
  185.                       "Cancel Job");
  186.  
  187.                     ppd.set_PlotMsgString(
  188.                     Pt.PlotMessageIndex.CancelSheetButtonMessage,
  189.                     "Cancel Sheet");
  190.  
  191.                     ppd.set_PlotMsgString(
  192.                     Pt.PlotMessageIndex.SheetSetProgressCaption,
  193.                     "Sheet Set Progress");
  194.  
  195.                     ppd.set_PlotMsgString(
  196.                       Pt.PlotMessageIndex.SheetProgressCaption,
  197.                      "Sheet Progress");
  198.  
  199.                     ppd.LowerPlotProgressRange = 0;
  200.                     ppd.UpperPlotProgressRange = 100;
  201.                     ppd.PlotProgressPos = 0;
  202.  
  203.                     // Let's start the plot, at last
  204.                     ppd.OnBeginPlot();
  205.                     ppd.IsVisible = true;
  206.                     pe.BeginPlot(ppd, null);
  207.  
  208.                     // We'll be plotting a single document
  209.                     pe.BeginDocument(pi, dwgFileName, null, 1, true,
  210.                       // Let's plot to file
  211.                      outputFileName);
  212.                     // Which contains a single sheet
  213.                     ppd.OnBeginSheet();
  214.                     ppd.LowerSheetProgressRange = 0;
  215.                     ppd.UpperSheetProgressRange = 100;
  216.                     ppd.SheetProgressPos = 0;
  217.                     Pt.PlotPageInfo ppi = new Pt.PlotPageInfo();
  218.                     pe.BeginPage(ppi, pi, true, null);
  219.                     pe.BeginGenerateGraphics(null);
  220.                     pe.EndGenerateGraphics(null);
  221.  
  222.                     // Finish the sheet
  223.                     pe.EndPage(null);
  224.                     ppd.SheetProgressPos = 100;
  225.                     ppd.OnEndSheet();
  226.                     // Finish the document
  227.                     pe.EndDocument(null);
  228.  
  229.                     // And finish the plot
  230.                     ppd.PlotProgressPos = 100;
  231.                     ppd.OnEndPlot();
  232.                     pe.EndPlot(null);
  233.                   }
  234.                 }
  235.               }
  236.             }
  237.           }
  238.           tr.Commit();
  239.         }
  240.       }
  241.       catch(Exception ex) {
  242.         ed.WriteMessage("\n{0}\n", ex.Message);
  243.       }
  244.     }
  245.  
  246.     /// <summary>
  247.     /// Опубликовать в PDF файл все регионы, находящиеся в пространстве модели
  248.     /// указанного пользователем DWG файла.
  249.     /// </summary>
  250.     [Rt.CommandMethod("PlotToPdf", Rt.CommandFlags.Session)]
  251.     public void PlotToPdfCommand() {
  252.       Ap.Document doc = cad.DocumentManager.MdiActiveDocument;
  253.       if(doc == null || doc.IsDisposed)
  254.         return;
  255.  
  256.       Ed.Editor ed = doc.Editor;
  257.       Db.Database db = doc.Database;
  258.  
  259.       using(doc.LockDocument()) {
  260.  
  261.         Microsoft.Win32.OpenFileDialog openFileDialog = new Microsoft.Win32
  262.   .OpenFileDialog();
  263.         openFileDialog.Title =
  264.           "Выберите DWG файл, подлежащий публикации в PDF";
  265.         openFileDialog.Filter = "DWG-файлы|*.dwg";
  266.         bool? result = openFileDialog.ShowDialog();
  267.  
  268.         if(!result.HasValue || !result.Value) {
  269.           ed.WriteMessage("\nВыполнение команды прервано, т.к. не был указан "
  270.             + "DWG-файл.");
  271.           return;
  272.         }
  273.  
  274.         String dwgFileName = openFileDialog.FileName;
  275.         String pdfFileName = System.IO.Path.GetFileNameWithoutExtension(
  276.                   dwgFileName) + ".pdf";
  277.         String pdfFileFullName = System.IO.Path.Combine(System.IO.Path
  278.           .GetDirectoryName(dwgFileName), pdfFileName);
  279.  
  280.         MessageBoxResult mbResult = MessageBox.Show(
  281.           "Печатать не создавая Document?", "Вопрос", MessageBoxButton.YesNo,
  282.           MessageBoxImage.Question);
  283.  
  284.         if(mbResult == MessageBoxResult.Yes) {
  285.           Gm.Point2d bottomLeft = Gm.Point2d.Origin;
  286.           Gm.Point2d topRight = Gm.Point2d.Origin;
  287.           Db.Database old = Hs.WorkingDatabase;
  288.           try {
  289.             using(Db.Database outputDb = new Db.Database(true, true)) {
  290.               outputDb.ReadDwgFile(dwgFileName,
  291.                 Db.FileOpenMode.OpenForReadAndReadShare, true, String.Empty);
  292.               Hs.WorkingDatabase = outputDb;
  293.               using(Db.Transaction tr = outputDb.TransactionManager
  294.                 .StartTransaction()) {
  295.  
  296.                 Db.BlockTableRecord model = tr.GetObject(
  297.                   Us.GetBlockModelSpaceId(outputDb), Db.OpenMode.ForRead)
  298.                   as Db.BlockTableRecord;
  299.                 List<Db.Region> regions = new List<Db.Region>();
  300.                 foreach(Db.ObjectId id in model) {
  301.                   if(id.ObjectClass.Name == "AcDbRegion") {
  302.                     Db.Region region = tr.GetObject(id, Db.OpenMode.ForRead)
  303.                       as Db.Region;
  304.                     regions.Add(region);
  305.                   }
  306.                 }
  307.  
  308.                 GetCommonVisualBoundary(regions, 0.1, ref bottomLeft,
  309.                   ref topRight);
  310.                 String formatName = "ISO_A4_(210.00_x_297.00_MM)";
  311.                 if((topRight.X - bottomLeft.X) > (topRight.Y - bottomLeft.Y))
  312.                   formatName = "ISO_A4_(297.00_x_210.00_MM)";
  313.  
  314.                 PlotRegion(outputDb, bottomLeft, topRight,
  315.                   "DWG To PDF.pc3", formatName, pdfFileFullName, dwgFileName);
  316.                 tr.Commit();
  317.               }
  318.             }
  319.           }
  320.           finally {
  321.             Hs.WorkingDatabase = old;
  322.           }
  323.           ed.WriteMessage("\nПубликация выполнена в файл \"{0}\"\n",
  324.           pdfFileFullName);
  325.         }
  326.         else {
  327.           Ap.Document doc2 = cad.DocumentManager.Open(dwgFileName, false);
  328.           Db.Database db2 = doc2.Database;
  329.           Ed.Editor ed2 = doc2.Editor;
  330.           using(Db.Transaction tr = db2.TransactionManager.StartTransaction()
  331.             ) {
  332.             List<Db.Region> regions = new List<Db.Region>();
  333.             Db.BlockTableRecord model = tr.GetObject(Us.GetBlockModelSpaceId(
  334.               db2), Db.OpenMode.ForRead) as Db.BlockTableRecord;
  335.             foreach(Db.ObjectId id in model) {
  336.               if(id.ObjectClass.Name == "AcDbRegion") {
  337.                 Db.Region region = tr.GetObject(id, Db.OpenMode.ForRead)
  338.                   as Db.Region;
  339.                 regions.Add(region);
  340.               }
  341.             }
  342.             String formatName = "ISO_A4_(210.00_x_297.00_MM)";
  343.  
  344.             Gm.Point2d bottomLeft = Gm.Point2d.Origin;
  345.             Gm.Point2d topRight = Gm.Point2d.Origin;
  346.             GetCommonVisualBoundary(regions, 0.1, ref bottomLeft,
  347.               ref topRight);
  348.             if((topRight.X - bottomLeft.X) > (topRight.Y - bottomLeft.Y))
  349.               formatName = "ISO_A4_(297.00_x_210.00_MM)";
  350.  
  351.             PlotRegion(db2, bottomLeft, topRight, "DWG To PDF.pc3",
  352.             formatName, pdfFileFullName, dwgFileName);
  353.  
  354.             tr.Commit();
  355.             ed2.WriteMessage("\nПубликация выполнена в файл \"{0}\"\n",
  356.           pdfFileFullName);
  357.           }
  358.         }
  359.       }
  360.     }
  361.     /// <summary>
  362.     /// Получить координаты границ левого нижнего и правого верхнего углов для
  363.     /// общего визуального "GeometricExtents" указанных регионов.
  364.     /// </summary>
  365.     /// <param name="regions">Регионы, для которых следует получить общие
  366.     /// координаты границ визуального "GeometricExtents".</param>
  367.     /// <param name="delta">Предельная арифметическая погрешность вычислений.
  368.     /// </param>
  369.     /// <param name="minPoint">Ссылка на переменную Point2d, в которой следует
  370.     /// сохранить координаты левого нижнего угла визуального
  371.     /// "GeometricExtents".</param>
  372.     /// <param name="maxPoint">Ссылка на переменную Point2d, в которой следует
  373.     /// сохранить координаты правого верхнего угла визуального
  374.     /// "GeometricExtents".</param>
  375.     public static void GetCommonVisualBoundary(IEnumerable<Db.Region>
  376.       regions, Double delta, ref Gm.Point2d minPoint, ref Gm.Point2d maxPoint
  377.       ) {
  378.       Double minX = Double.MaxValue;
  379.       Double minY = Double.MaxValue;
  380.       Double maxX = Double.MinValue;
  381.       Double maxY = Double.MinValue;
  382.       Gm.Point2d tmpMin = Gm.Point2d.Origin;
  383.       Gm.Point2d tmpMax = Gm.Point2d.Origin;
  384.       foreach(Db.Region region in regions) {
  385.         GetVisualBoundary(region, delta, ref tmpMin, ref tmpMax);
  386.         minX = Math.Min(minX, tmpMin.X);
  387.         minY = Math.Min(minY, tmpMin.Y);
  388.         maxX = Math.Max(maxX, tmpMax.X);
  389.         maxY = Math.Max(maxY, tmpMax.Y);
  390.       }
  391.       minPoint = new Gm.Point2d(minX, minY);
  392.       maxPoint = new Gm.Point2d(maxX, maxY);
  393.     }
  394.  
  395.     /// <summary>
  396.     /// Получить координаты границ левого нижнего и правого верхнего углов для
  397.     /// визуального "GeometricExtents" региона.
  398.     /// </summary>
  399.     /// <param name="region">Регион, для которого следует получить координаты
  400.     /// границ визуального "GeometricExtents".</param>
  401.     /// <param name="delta">Предельная арифметическая погрешность вычислений.
  402.     /// </param>
  403.     /// <param name="minPoint">Ссылка на переменную Point2d, в которой следует
  404.     /// сохранить координаты левого нижнего угла визуального
  405.     /// "GeometricExtents".</param>
  406.     /// <param name="maxPoint">Ссылка на переменную Point2d, в которой следует
  407.     /// сохранить координаты правого верхнего угла визуального
  408.     /// "GeometricExtents".</param>
  409.     public static void GetVisualBoundary(Db.Region region, Double delta,
  410.    ref Gm.Point2d minPoint, ref Gm.Point2d maxPoint) {
  411.       using(Gm.BoundBlock3d boundBlk = new Gm.BoundBlock3d()) {
  412.         using(Br.Brep brep = new Br.Brep(region)) {
  413.           foreach(Br.Edge edge in brep.Edges) {
  414.             using(Gm.Curve3d curve = edge.Curve) {
  415.               Gm.ExternalCurve3d curve3d = curve as Gm.ExternalCurve3d;
  416.               // Делать точный расчет нужно только если образующая - сплайн
  417.               // в противном случае достаточно получить BoundBlock
  418.               if(curve3d != null && curve3d.IsNurbCurve) {
  419.                 using(Gm.NurbCurve3d nurbCurve = curve3d.NativeCurve
  420.                   as Gm.NurbCurve3d) {
  421.                   Gm.Interval interval = nurbCurve.GetInterval();
  422.                   for(double par = interval.LowerBound; par <=
  423.                     interval.UpperBound; par += (delta * 2.0)) {
  424.                     Gm.Point3d p = nurbCurve.EvaluatePoint(par);
  425.                     if(!boundBlk.IsBox)
  426.                       boundBlk.Set(p, p);
  427.                     else
  428.                       boundBlk.Extend(p);
  429.                   }
  430.                 }
  431.               }
  432.               else {
  433.                 if(!boundBlk.IsBox) {
  434.                   boundBlk.Set(edge.BoundBlock.GetMinimumPoint(),
  435.                     edge.BoundBlock.GetMaximumPoint());
  436.                 }
  437.                 else {
  438.                   boundBlk.Extend(edge.BoundBlock.GetMinimumPoint());
  439.                   boundBlk.Extend(edge.BoundBlock.GetMaximumPoint());
  440.                 }
  441.               }
  442.             }
  443.           }
  444.         }
  445.         boundBlk.Swell(delta);
  446.         // Возвращаем вычисленный результат
  447.         minPoint = new Gm.Point2d(boundBlk.GetMinimumPoint().X,
  448.           boundBlk.GetMinimumPoint().Y);
  449.         maxPoint = new Gm.Point2d(boundBlk.GetMaximumPoint().X,
  450.           boundBlk.GetMaximumPoint().Y);
  451.       }
  452.     }
  453.   }
  454. }

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
На др. файле все регионы выводятся на печать, но содержимое по прежнему не цветное (если без Document).

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
2. Часть распечатываемой информации отсутствует.
Первая идея - acedTrans работает только с активным документом. Т.е. мало того, что чертеж должен быть открыт как документ, так он еще и должен быть активным.
По поводу цвета и его отсутствия идей пока нет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Первая идея - acedTrans работает только с активным документом.
это предположение или утверждение?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
это предположение или утверждение?
Это утверждение. Причем я уверен в нём на 100%. Посмотри описание функции acedTrans. Она ничего не знает ни про какие базы, кроме как про базу активного в редакторе AutoCAD документа. Да и система координат DCS имеет смысл только в документе, загруженном в редактор AutoCAD.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Тогда почему на др. DWG файлах все примитивы выводятся на печать полностью? Я проверял несколько файлов. Кроме того, каким боком acedTrans, занимающаяся пересчётом координат (что она, кстати, делает корректно как с использованием Document, так и без него) может влиять на визуальное отображение примитивов при выводе их на печать?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Тогда почему на др. DWG файлах все примитивы выводятся на печать полностью? Я проверял несколько файлов.
Как я понимаю в данном случае acedTrans использует системы координат из открытого в редакторе AutoCAD чертежа, а не из того, который открываешь ты.
Возможно для других файлов это нормально, а для этого нет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Как я понимаю в данном случае acedTrans использует системы координат из открытого в редакторе AutoCAD чертежа, а не из того, который открываешь ты.
Возможно, что вы неправильно понимаете: регионы чертежа, из которого выполняется печать, перенесены максимально близко к началу координат WCS и не соответствуют тому, что отображается в текущем документе. Кроме того, странно что вы не заметили: не отображаемый при печати примитив попадает в зону печати.

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
А если при текущем "этом" чертеже вызвать печать его-же, но через DB? Не будет-ли он цветным?? Если да - то скорее всего "беда" в строке 117 (точнее 118), т.к. шаблон берется "текущий", и видать не все-таки параметры устанавливаются.
з.ы. И давай все таки ошибки в "хеловордах" показывать - лазить по всему коду я например не всегда готов.

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
з.ы. И давай все таки ошибки в "хеловордах" показывать - лазить по всему коду я например не всегда готов.
Ты невнимательно читаешь. Код рабочий, исключений не возникает.
Цитировать
А если при текущем "этом" чертеже вызвать печать его-же, но через DB?
И про это я писал:
Цитировать
Ниже прикреплены результаты публикации в PDF с использованием Document и без его использования. Там же выложен исходный DWG файл, на примере которого тестировался код.
На скринах видно, что не совсем ожидаемый результат только при использовании "DB".

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Читай еще раз - с запятыми все верно, про исключения я ничего не писал - ошибки это не обязательно исключения.
При текущем напечатать его-же но через DB - цвет будет?