doctorraz Posted September 7, 2022 Report Share Posted September 7, 2022 (edited) Каким образом можно программно изменить именованный стиль печати на цветозависимый и наоборот? Дело в том, что такая конструкция (предварительно пространству задан именованный стиль печати), хоть и меняет таблицу стилей 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 October 12, 2022 by doctorraz Quote Link to comment Share on other sites More sharing options...
Светлана Мирончик Posted September 7, 2022 Report Share Posted September 7, 2022 У меня получалось переключать сменой файла таблиц, как у вас в примере. Но я делала через 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(); } Quote Link to comment Share on other sites More sharing options...
doctorraz Posted September 7, 2022 Author Report Share Posted September 7, 2022 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" Спойлер добавь в конец своего кода doc.Editor.Regen(); dynamic comDoc = doc.AcadDocument;// as nanoCAD.Document; /*nanoCAD.InanoCADPlot*/ dynamic plot = comDoc.Plot; plot.PlotToDevice(); выведи из кода на печать у меня выводит стилем ncad.ctb, Спойлер т.е. настройки применились после открытия окна печати Спойлер и 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 одно на всю базу и меняется походу только при открытии окна печати... Вопрос!! каким стилем будет ПУБЛИКАЦИЯ из такого разномастного чертежа??? Quote Link to comment Share on other sites More sharing options...
EdwardSt Posted September 7, 2022 Report Share Posted September 7, 2022 11 минут назад, doctorraz сказал: Вопрос!! каким стилем будет ПУБЛИКАЦИЯ из такого разномастного чертежа??? Публикация средствами нано - вполне себе. Публикация средствами АС - если не упадет, то иногда будет по дефолту, т.е. без использования стиля вообще. Quote Link to comment Share on other sites More sharing options...
doctorraz Posted September 7, 2022 Author Report Share Posted September 7, 2022 3 минуты назад, EdwardSt сказал: 16 минут назад, doctorraz сказал: стилем будет ПУБЛИКАЦИЯ из такого разномастного чертежа??? Публикация средствами нано - вполне себе. ты проверь, он публикует либо в именованных либо цветозависимых в другой теме файл давал.. и пдф, что получилось.. имхо программа должна делать что ей велено в точности, либо выбрасывать исключение... нано делает молча отсебятину Quote Link to comment Share on other sites More sharing options...
EdwardSt Posted September 7, 2022 Report Share Posted September 7, 2022 31 минуту назад, doctorraz сказал: нано делает молча отсебятину Я надеюсь, что пока. В параллельной ветке вроде сошлись на том, что со стилями следует так или иначе допилить. Поэтому и написал "вполне себе", как бы авансом, ибо так задумано. В отличии от АС, где это однозначно НЕ задумано и даже противопоказано. 1 Quote Link to comment Share on other sites More sharing options...
doctorraz Posted September 7, 2022 Author Report Share Posted September 7, 2022 (edited) 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 September 7, 2022 by doctorraz 1 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.