Jump to content

[Решено, фикс разработчика] Как программно переключать типы стилей печати?


Recommended Posts

Каким образом можно программно изменить именованный стиль печати на цветозависимый и наоборот?

Дело в том, что такая конструкция (предварительно пространству задан именованный стиль печати), хоть и меняет таблицу стилей 

Sub plotnotplot()
Set objApp = GetObject(, "nanoCAD.Application") 'цепляемся к нане
Set comdoc = objApp.ActiveDocument

Set al = comdoc.ActiveLayout
Set Plot = comdoc.Plot
Set cps = Plot.CustomPlotSettings(al)

al.StyleSheet = "monochrome.ctb"

'это походу лишнее
cps.ColorMode = True
Plot.CustomPlotSettings(al) = cps

Plot.PlotToDevice

End Sub

но выводит на печать с прежней таблицей печати.

если руками открыть и ничего не меняя закрыть окно печати, то тип стиля печати меняется...

Есть решение сделать полностью программно?

Edited by doctorraz
Link to comment
Share on other sites

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

 

Link to comment
Share on other sites

 

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

я делала через PlotSettingsValidator

так то же не переключает

Layout layout;
                using (Transaction tr = db.TransactionManager.StartTransaction())
                {
                    layout = tr.GetObject(item.objIdlayout, OpenMode.ForWrite) as Layout;
                    //сразу включаем стили
                    
                    PlotSettingsValidator psv = PlotSettingsValidator.Current;
                    layout.PlotPlotStyles = true;

                    psv.SetCurrentStyleSheet(layout, sStyle);

                 //----------

                    tr.Commit();
                }

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

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

 

поставь в коде стиль "monochrome.ctb"

Спойлер

image.png.33481a178868bb3d0d5205ac5f0617f6.png

добавь в конец своего кода

 			doc.Editor.Regen();
            dynamic comDoc = doc.AcadDocument;// as nanoCAD.Document;
            /*nanoCAD.InanoCADPlot*/
            dynamic plot = comDoc.Plot;
            plot.PlotToDevice();

выведи из кода на печать

у меня выводит стилем ncad.ctb,

Спойлер

image.png.da0d09398888cd50037b40d5aaa85227.png

т.е. настройки применились после открытия окна печати

 

Спойлер

image.thumb.png.2680e777dce8be1852d32ff25537e43c.png

 

и PlotStyleMode станет тру только после открытия окна печати (даже открыть закрыть ничего не трогая), а до тех пор настройки не применятся, хоть сто раз код гоняй....

Отсюда собственно и вопрос, чего такого окно печати делает и как за это из API подергать?

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

автокад эксэпшн выкидывает если ставить стиль  печати не в соответствии с PlotStyleMode

 

добавлено через 2 минуты
Спойлер
      public static 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("PlotSettings01"))
                {
                    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");
                validator.SetCurrentStyleSheet(pSettings, "monochrome.ctb");
                currentLayout.CopyFrom(pSettings);
                currentLayout.UpgradeOpen();
                trans.Commit();
            }
            doc.Editor.Regen();
            dynamic comDoc = doc.AcadDocument;// as nanoCAD.Document;
            /*nanoCAD.InanoCADPlot*/
            dynamic plot = comDoc.Plot;
            plot.PlotToDevice();
        }

 

естественно стиль у пространства должен быть именованным

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

файлик для экспериментов

 

named style.dwg

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

тут еще нюанс..

коль нана позволяет в одном чертеже и именованные и цветозависимые стили!!!!

а PlotStyleMode  одно на всю базу

и меняется походу только при открытии окна печати...

Вопрос!! каким стилем будет ПУБЛИКАЦИЯ из такого разномастного чертежа???

Link to comment
Share on other sites

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

Вопрос!! каким стилем будет ПУБЛИКАЦИЯ из такого разномастного чертежа???

Публикация средствами нано - вполне себе.

Публикация средствами АС - если не упадет, то иногда будет по дефолту, т.е. без использования стиля вообще.

Link to comment
Share on other sites

3 минуты назад, EdwardSt сказал:
16 минут назад, doctorraz сказал:

стилем будет ПУБЛИКАЦИЯ из такого разномастного чертежа???

Публикация средствами нано - вполне себе.

ты проверь, он публикует либо в именованных либо цветозависимых

в другой теме файл давал.. и пдф, что получилось..

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

нано делает молча отсебятину

Link to comment
Share on other sites

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

нано делает молча отсебятину

Я надеюсь, что пока.

В параллельной ветке вроде сошлись на том, что со стилями следует так или иначе допилить.

Поэтому и написал "вполне себе", как бы авансом, ибо так задумано.

В отличии от АС, где это однозначно НЕ задумано и даже противопоказано.

  • Like 1
Link to comment
Share on other sites

19 минут назад, EdwardSt сказал:

В параллельной ветке вроде сошлись на том, что со стилями следует так или иначе допилить

фиксом доволен вполне...

собственно фикс ответ на вопрос этой ветки

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

теперь даже так работает

Sub plotnotplot()
Set objApp = GetObject(, "nanoCAD.Application") 'цепляемся к нане
Set comdoc = objApp.ActiveDocument

Set al = comdoc.ActiveLayout
Set Plot = comdoc.Plot
al.StyleSheet = "monochrome.ctb"

Plot.PlotToDevice'цветозависимым
al.StyleSheet = "monochrome.stb"
Plot.PlotToDevice'именованным
End Sub

 

Edited by doctorraz
  • Like 1
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...