Jump to content

Пакетная печать. Краш при получении расширенных настроек


Recommended Posts

При пакетной обработке чертежей (открыли файл, чето сделали закрыли)

если было обращение к расширенным настройкам печати

nanoCAD.InanoCADPlotCustomParams customPlotSettings = plot.CustomPlotSettings[activeLayout];

и обрабатываемые файлы программно закрывались, то при выходе из командного метода (именно на последней скобке закрывающего метода) нана22 молча валится

В Нана 20 все хорошо

Спойлер
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

#if NC
using App = HostMgd.ApplicationServices;
using Cad = HostMgd.ApplicationServices.Application;
using Db = Teigha.DatabaseServices;
using Gem = Teigha.Geometry;
using Ed = HostMgd.EditorInput;
using Rtm = Teigha.Runtime;

#else

using App = Autodesk.AutoCAD.ApplicationServices;
using Cad = Autodesk.AutoCAD.ApplicationServices.Application;
using Db = Autodesk.AutoCAD.DatabaseServices;
using Gem = Autodesk.AutoCAD.Geometry;
using Ed = Autodesk.AutoCAD.EditorInput;
using Rtm = Autodesk.AutoCAD.Runtime;

#endif


namespace PubCrach
{
    public class Command : Rtm.IExtensionApplication
    {


        [Rtm.CommandMethod("Crashs", Rtm.CommandFlags.Session)]
        public void CrashS()
        {
            Crash();
        }

        [Rtm.CommandMethod("Crash")]
        public void Crash()
        {
            Ed.Editor ed = App.Application.DocumentManager.MdiActiveDocument.Editor;

            //сюда вернемся
            App.Document activeDoc = Cad.DocumentManager.MdiActiveDocument;
            //с ним работаем
            App.Document docWork;
            string sFile = @"c:\Temp\test.dwg";
            for (int i = 1; i < 5; i++)
            {
                //откроем
                docWork = Cad.DocumentManager.Open(sFile, true);

                ed.WriteMessage("\nОткрыли {0}", i);

                //типа печать
                #region CustomPlotSettings
                HostMgd.ApplicationServices.Document doc = HostMgd.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
                nanoCAD.Document comDoc = doc.AcadDocument as nanoCAD.Document;
                Teigha.DatabaseServices.Database db = doc.Database;
                //HostMgd.EditorInput.Editor ed = doc.Editor;

                // Получение ссылки на активный лист документа
                OdaX.IAcadLayout activeLayout = comDoc.ActiveLayout;

                // Получение ссылки на свойство Plot активного документа
                nanoCAD.Plot plot = (nanoCAD.Plot)comDoc.Plot;

                // Получение ссылки на расширенные настройки печати активного документа
                //!!!!!ЕСЛИ ЗАКОМММЕНТИРОВАТЬ ЭТУ СТРОЧКУ ТО ВЫЛЕТОВ НЕ БУДЕТ
                nanoCAD.InanoCADPlotCustomParams customPlotSettings = plot.CustomPlotSettings[activeLayout];
                #endregion

                ed.WriteMessage("\nПечатаем {0}", i);
                //закрываем
                //!!ЕСЛИ НЕ ЗАКРЫВАТЬ ТО НЕ ВЫЛЕТАЕТ

                docWork.CloseAndDiscard();

                ed.WriteMessage("\nЗакрыли {0}", i);

            }
            ed.WriteMessage("\nПри выходе НАНА22 упадет");

        }



        public void Initialize()
        {
            //throw new NotImplementedException();
        }

        public void Terminate()
        {
            //throw new NotImplementedException();
        }
    }
}

 

не зависимо лочим мы документ или нет,  команда в контексте документа или приложения...

нана22 упадет, если не закрывать документы, не упадет...

-----------

у кого есть возможность посмотрите пожалуйста..

надеюсь, что косячу я..

если баг это навечно

Спойлер

 

 

PubCrachPrj.zip

Edited by doctorraz
удалил DLL, там неверный путь, сразу валиться будет
  • Like 2
Link to comment
Share on other sites

самый прикол,

что такаяжэж шляпа из эксель работает без проблем

Sub Notcrach()
    sFile = "c:\Temp\test.dwg"
    Set objNanoCAD = GetObject(, "nanoCAD.Application")
    For i = 1 To 10
        Set comdoc = objNanoCAD.Documents.Open(sFile)
        Set al = comdoc.ActiveLayout
        Set Plot = comdoc.Plot
        Set cps = Plot.CustomPlotSettings(al)
        comdoc.Close
    Next
End Sub

 

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

 

Link to comment
Share on other sites

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

Edited by Светлана Мирончик
Link to comment
Share on other sites

31 минуту назад, Светлана Мирончик сказал:

правильная версия nanocad Type Library

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

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

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

то dynamic 

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

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

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

31 минуту назад, Светлана Мирончик сказал:

срабатывают как надо в 22й

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

а попробуй 

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

---------

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

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

Edited by doctorraz
  • Like 1
Link to comment
Share on other sites

Еще грустный нюансец

Дома не установлен нано20

соответственно подключить Interop.nanoCAD.dll и Interop.OdaX.dll не получится(((

c:\NCP_SDK_20.1.5304.3354.5404\include-x64\ncauto.tlb пустышка

 

еще при сборке ошибки

1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\Microsoft.Common.CurrentVersion.targets(2827,5): warning MSB3305: обработка ссылки COM "OdaX" из пути "C:\Program Files\Nanosoft\nanoCAD x64 22.0\bin\OdaX_csd.dll". Программе импорта библиотек типов не удалось преобразовать сигнатуру для члена "tagCALPOLESTR.pElems".
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\Microsoft.Common.CurrentVersion.targets(2827,5): warning MSB3305: обработка ссылки COM "OdaX" из пути "C:\Program Files\Nanosoft\nanoCAD x64 22.0\bin\OdaX_csd.dll". Программе импорта библиотек типов не удалось преобразовать сигнатуру для члена "tagCADWORD.pElems".

===================================

но собирается и работает, с учетом вышенаписанного

 

добавлено через 7 минут

открыл отладку нано в студии

пишет такую ошибку

 

------

Необработанное исключение по адресу 0x00007FFE109CE00E (ucrtbase.dll) в nCadS.exe: Запрашивается выход из программы в результате неустранимой ошибки.

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

 

Link to comment
Share on other sites

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 перестал крашиться после этой доработки.

Edited by Светлана Мирончик
  • Like 1
  • Thanks 1
Link to comment
Share on other sites

Только что, Светлана Мирончик сказал:

Marshal.ReleaseComObject() для всех COM-объектов

Спасибо добавлю, попробую

 

Но нано20 это ничего не требуется..

 

Есть шанс, что следующие нановерсии избавят от этого бага?

Link to comment
Share on other sites

1 час назад, Светлана Мирончик сказал:

внутри цикла Marshal.ReleaseComObject() для всех COM-объектов

таки да dance.gif.54f4c6e5a147bed173cea3cd9a1a64c0.gifbravo.gif.607792a4483b34029c4cf4de0bcd4325.gifdance.gif.54f4c6e5a147bed173cea3cd9a1a64c0.gifbravo.gif.607792a4483b34029c4cf4de0bcd4325.gifdance.gif.54f4c6e5a147bed173cea3cd9a1a64c0.gif

Спасибо БОЛЬШОЕ congrats.gif.edbbc5f34e545fb53559d2d1b497a35a.gifcongrats.gif.edbbc5f34e545fb53559d2d1b497a35a.gifcongrats.gif.edbbc5f34e545fb53559d2d1b497a35a.gif

Спойлер
  [Rtm.CommandMethod("динамик", Rtm.CommandFlags.Session)]
        public void CrashDin()
        {
            //болтушка
            Ed.Editor ed = Cad.DocumentManager.MdiActiveDocument.Editor;

            //сюда вернемся
            App.Document activeDoc = Cad.DocumentManager.MdiActiveDocument;

            string sFile = @"c:\Temp\test.dwg";

            for (int i = 1; i < 40; i++)
            {
                //откроем
                App.Document docWork = Cad.DocumentManager.Open(sFile, true);

                ed.WriteMessage("\nОткрыли {0}", i);

                //типа печать
                #region CustomPlotSettings

                dynamic comDoc = docWork.AcadDocument;

                // Получение ссылки на активный лист документа
                dynamic activeLayout = comDoc.ActiveLayout;

                // Получение ссылки на свойство Plot активного документа
                dynamic plot = comDoc.Plot;

                // Получение ссылки на расширенные настройки печати активного документа
                dynamic customPlotSettings = plot.CustomPlotSettings[activeLayout];

                #endregion

                ed.WriteMessage("\nПечатаем {0}", i);

                //уменьшаем ссылки rcW
                Marshal.ReleaseComObject(comDoc);
                Marshal.ReleaseComObject(activeLayout);
                Marshal.ReleaseComObject(plot);
                Marshal.ReleaseComObject(customPlotSettings);

                docWork.CloseAndDiscard();
                //docWork.Dispose();

                ed.WriteMessage("\nЗакрыли {0}", i);

            }
            //!!ТЕПЕРЬ НЕ ВЫЛЕТАЕТ!!!!
            ed.WriteMessage("\nПри выходе НАНА22 НЕ упадет");

            //возвращаем активный
            Cad.DocumentManager.MdiActiveDocument = activeDoc;
            App.Application.DocumentManager.DocumentActivationEnabled = true;

        }

 

а то чуть руки не опустилdonno.gif.e31ca6d8c4e80322b7edfa9482e57ae4.gif

добавлено через 9 минут

в этом коде Dispose вроде как не влияет, но появилась идея для

в 6122 немного поправили, но иногда ID пустой, рандом полнейший

без Using ID всегда  приходят, но утечка памяти, попробую ручками Dispose

  • Like 2
Link to comment
Share on other sites

  • doctorraz changed the title to Пакетная печать. Краш при получении расширенных настроек

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Tell a friend

    Love Официальный форум компании Нанософт Разработка? Tell a friend!
×
×
  • Create New...