S17 1 14 декабря, 2021 Опубликовано 14 декабря, 2021 · Жалоба Коллеги Как внутри скрипта сохранить копию схемы? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
peshkoff 24 14 декабря, 2021 Опубликовано 14 декабря, 2021 · Жалоба в теле скрипта? что есть в скрипте уже? с этого надо начинать Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
S17 1 14 декабря, 2021 Опубликовано 14 декабря, 2021 (изменено) · Жалоба Вот (я подозреваю, что основа Вам знакома :) ) Spoiler Procedure HideParameters(); // Удаляет механические компоненты с дезигнатором "E?" и скрывает все параметры, кроме Comment, остальных компонентов. var Workspace : IWorkspace; Project : IProject; Document : IDocument; SchDocument : ISch_Sheet; Iterator : ISch_Iterator; ParamIterator : ISch_Iterator; Component : ISch_Component; Parameter : ISch_Parameter; i : Integer; Des : String; function GetDesPref(const InputStr : String) : String; var resultStr : String; m : integer; begin resultStr := ''; for m := 1 to Length(InputStr) do // от 1-ого символа и до конца строки begin if (InputStr[m] >= '0') and (InputStr[m] <= '9') then InputStr := InputStr + InputStr[m] else if (InputStr[m] <> '?') then resultStr := resultStr + InputStr[m] end; Result := resultStr; end; begin Workspace := GetWorkspace; Project := Workspace.DM_FocusedProject; if (Project = nil) then Begin ShowMessage('No Project opened.'); exit; end; if SchServer = Nil Then Exit; for i := 0 to Project.DM_LogicalDocumentCount - 1 do begin if (Project.DM_LogicalDocuments(i).DM_DocumentKind <> 'SCH' ) then Continue; Document := Client.OpenDocument('Sch', Project.DM_LogicalDocuments(i).DM_FullPath); Client.ShowDocument(Document); SchDocument := SchServer.GetCurrentSchDocument; // Попытка сохранить копию файла: //ShowMessage(SchDocument.DocumentName); // имя и полный путь файла //Des := SchDocument.DocumentName; //SchDocument.SaveToFile(Des + '_Copy.Sch'); // сохранить копию на всякий случай - не работает //ShowMessage(Document.DM_FileName + ', path: ' + Document.DM_FullPath + ', DispName: ' + Document.DM_GetState_DocDisplayName); // - не работает //Document.SaveToFile(Des + '_CopyDM.Sch'); // - не работает Iterator := SchDocument.SchIterator_Create; Iterator.AddFilter_ObjectSet(MkSet(eSchComponent)); try Component := Iterator.FirstSchObject; while Component <> nil do begin Des := Component.Designator.Text; if (Des[1] = 'E') then begin //ShowMessage('Designator: ' + Des); SchDocument.RemoveSchObject(Component); // удаляем механический компонент end else begin try ParamIterator := Component.SchIterator_Create; ParamIterator.AddFilter_ObjectSet(MkSet(eParameter)); Parameter := ParamIterator.FirstSchObject; while Parameter <> nil do begin if Parameter.Name <> 'Comment' then Parameter.IsHidden := true; Parameter := ParamIterator.NextSchObject; end; finally Component.SchIterator_Destroy(ParamIterator); end; end; Component := Iterator.NextSchObject; end; finally SchDocument.SchIterator_Destroy(Iterator); SchDocument.GraphicallyInvalidate; end; end; ShowMessage('End!'); end; Строчки с попыткой сохранить копию - закомментированы: не работают, т.к. нет такого метода "SaveToFile" у них, а подобного я не нашёл... Изменено 14 декабря, 2021 пользователем S17 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
peshkoff 24 14 декабря, 2021 Опубликовано 14 декабря, 2021 · Жалоба Не, назнакома. Я тут подумал, что обычно кромсаю схемы и платы без сохранения копии :))) ну короче, вы используете метод SaveToFile. Это не альтиумовская функция, а оригинальная от дельфи. она позволяет текст Str, StringList и пр. сохранить в файл. не наш случай. здесь нужно действовать через Client. или Workspase. и т.д. т.е. с теми функциями, которые знают содержимое. второй вариант: действовать через процессы. Все процессы, которые закреплены за кнопками можно писать в коде ResetParameters; AddStringParameter('ObjectKind','Document'); AddStringParameter('SaveMode','SaveCopyAs'); RunProcess('WorkspaceManager:SaveObject'); ResetParameters; это я скопировал из кнопки SaveAs. В таком виде будет появляться окно. Можно покопаться поглубже и попробовать отключить окно, но что-то я сомневаюсь, что так можно сделать третий вариант - использовать форму (вообще в этом деле форма обязательна, хотелось бы хоть примерно знать, что произойдет при работе скрипта) На форму внедрить TSaveDialog, там сразу будет доступ к куче вариантов сохранения (вроде. сто лет не использовал уже) --------------- блин... думаю самый простой вариант: использовать движок дельфи для работы с файлами https://space-base.ru/library/delphi/function-copyfile Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
S17 1 14 декабря, 2021 Опубликовано 14 декабря, 2021 · Жалоба "CopyFile" - спасибо, работает! Как всё просто! :) Но тут надо учесть, что сделанные и несохранённые изменения в схеме не попадут в эту копию. Но мне этот метод годится. В Client есть Open, а вот что-то напоминающее Save там не нашёл... Раньше тоже не заботился о сохранении - 18-ая версия сигнализировала о них: файл был "красным" и его можно было закрыть без сохранения и открыть в исходном состоянии. Данный скрипт скрывает на схеме все параметры, кроме Comment, и удаляет механические компоненты - для распечатки по ГОСТ и эти изменения сохранять не нужно, а вот исходную непотраханную схему на всякий случай сохранить надо бы... В версии 21.5 есть какая-то засада: изменённый скриптом файл схемы не подсвечивается красным и если его закрыть и открыть заново, то он представляется в изменённом состоянии - как будто эти изменения были сохранены! Но на самом деле это не так - сам файл пребывает в исходном состоянии и если закрыть и открыть уже проект, то схема будет представлена в первозданном виде! Т.е. при открытом проекте схема открывается как бы не из файла, а из кэша... Тут результирующий скрипт - Удаляет механические компоненты с дезигнатором "E?" и скрывает все параметры, кроме Comment, остальных компонентов.: Spoiler Procedure _HideParametersDel_E(Del_E : Boolean); // Удаляет механические компоненты с дезигнатором "E?" и скрывает все параметры, кроме Comment, остальных компонентов. var Workspace : IWorkspace; Project : IProject; Document : IDocument; SchDocument : ISch_Sheet; Iterator : ISch_Iterator; ParamIterator : ISch_Iterator; Component : ISch_Component; Parameter : ISch_Parameter; i : Integer; Des : String; function GetDesPref(const InputStr : String) : String; var resultStr : String; m : integer; begin resultStr := ''; for m := 1 to Length(InputStr) do // от 1-ого символа и до конца строки begin if (InputStr[m] >= '0') and (InputStr[m] <= '9') then InputStr := InputStr + InputStr[m] else if (InputStr[m] <> '?') then resultStr := resultStr + InputStr[m] end; Result := resultStr; end; begin Workspace := GetWorkspace; Project := Workspace.DM_FocusedProject; if (Project = nil) then Begin ShowMessage('No Project opened.'); exit; end; if SchServer = Nil Then Exit; for i := 0 to Project.DM_LogicalDocumentCount - 1 do begin if (Project.DM_LogicalDocuments(i).DM_DocumentKind <> 'SCH' ) then Continue; Document := Client.OpenDocument('Sch', Project.DM_LogicalDocuments(i).DM_FullPath); Client.ShowDocument(Document); SchDocument := SchServer.GetCurrentSchDocument; // Сохранить копию файла: //ShowMessage(SchDocument.DocumentName); // имя и полный путь файла Des := SchDocument.DocumentName; CopyFile(Des, Des + '_Copy.Sch', false); // Сохранить ФАЙЛ - несохранённые изменения в копию не попадут! Перезаписать существующий файл, если он есть. Iterator := SchDocument.SchIterator_Create; Iterator.AddFilter_ObjectSet(MkSet(eSchComponent)); try Component := Iterator.FirstSchObject; while Component <> nil do begin Des := Component.Designator.Text; if (Del_E And (Des[1] = 'E')) then begin //ShowMessage('Designator: ' + Des); SchDocument.RemoveSchObject(Component); // удаляем механический компонент end else begin try ParamIterator := Component.SchIterator_Create; ParamIterator.AddFilter_ObjectSet(MkSet(eParameter)); Parameter := ParamIterator.FirstSchObject; while Parameter <> nil do begin if Parameter.Name <> 'Comment' then Parameter.IsHidden := true; Parameter := ParamIterator.NextSchObject; end; finally Component.SchIterator_Destroy(ParamIterator); end; end; Component := Iterator.NextSchObject; end; finally SchDocument.SchIterator_Destroy(Iterator); SchDocument.GraphicallyInvalidate; end; end; ShowMessage('Happy End!'); end; // Только скрыть параметры: Procedure HideParameters; begin _HideParametersDel_E(false); end; // Удалить механику и скрыть параметры: Procedure HideParametersAndDel_E; begin _HideParametersDel_E(true); end; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
peshkoff 24 15 декабря, 2021 Опубликовано 15 декабря, 2021 · Жалоба 11 hours ago, S17 said: надо учесть, что сделанные и несохранённые изменения в схеме не попадут в эту копию конечно, ведь эта функция работает на уровне файла. если в тотал командере скопировать файл до того, как нажать Save в программе он тоже скопируется без изменений. Тут тоже есть варианты: 1. Предупредить, что есть несохранные данные (вроде там есть в Client. что-то подобное) 2. Тупо сохранить все процессом .... if SchServer = Nil Then Exit; ResetParameters; AddStringParameter('ObjectKind','FocusedProject'); AddStringParameter('ModifiedOnly','True'); RunProcess('WorkspaceManager:SaveObject'); ResetParameters; for i := 0 to Project.DM_LogicalDocumentCount - 1 do .... 'ObjectKind','FocusedProject' будет сохранять только проектные файлы, а не все, какие открыты Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
S17 1 15 декабря, 2021 Опубликовано 15 декабря, 2021 · Жалоба Благодарю! Но в моём конкретном скрипте лучше подходит именно копирование исходного файла без учёта изменений: порой ручками тоже приходится что-то удалять/корректировать для ГОСТовской распечатки, но не для сохранения!, и бывает, что это происходит до работы этого скрипта - поэтому в этом скрипте для меня лучше сохраниться на уровне исходного файла. Да и кнопки в Альтиуме сохранения файла и "File/Run Script.." находятся очень близко - один раз я промахнулся... и сохранил ГОСТовскую макулатуру... Как оказалось, сохранить схему (или другой объект) с изменениями - это не особо очевидная операция в Альтиуме... Спасибо за предложенный способ! ХитрО :) Хотел для версии 21.5 Альтиума пометить файл, изменённый скриптом, как изменённый (т.к. версия 21.5 не замечает эти изменения) - использовал "SchDocument.DocumentModifiedChanged()", но схемный файл почему-то "не покраснел" (ни при true, ни при false)... Я подумал, что если "насильно" пометить файл изменённым, то исходный тогда будет браться Альтиумом не из кэша, а уже из файла.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
peshkoff 24 15 декабря, 2021 Опубликовано 15 декабря, 2021 · Жалоба 1 hour ago, S17 said: ...в моём конкретном скрипте лучше подходит... Тогда запрос как минимум должен быть. Нужно расчитывать на использование еще кем либо. Должно все быть максимально юзабельно и прозрачно (а не как у программистов из альтиума). Да и сам обычно забываешь через какое то время что там делается "автоматически" Если схема правилась, то нужно спросить "Желаем сохраниться или нет?" 1 hour ago, S17 said: "File/Run Script.." Кнопку на панель для скрипта надо вытащить Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dee2mon 3 15 декабря, 2021 Опубликовано 15 декабря, 2021 · Жалоба Чуть в сторону еще вопрос по скриптам. А до SDK для драфтсмана кто-нибудь смог добраться? На сайте актуального ничего нет или я ничего не смог найти.. Есть некоторые задачи по автоматизации рисования чертежей, особенно в части установочных видов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
popms 3 15 декабря, 2021 Опубликовано 15 декабря, 2021 · Жалоба Just now, dee2mon said: Чуть в сторону еще вопрос по скриптам. А до SDK для драфтсмана кто-нибудь смог добраться? На сайте актуального ничего нет или я ничего не смог найти.. Есть некоторые задачи по автоматизации рисования чертежей, особенно в части установочных видов. у драфтсмана нет SDK. Драфтсман - это тоже по сути большой скрипт/плагин, который сам использует SDK альтиума. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dee2mon 3 15 декабря, 2021 Опубликовано 15 декабря, 2021 · Жалоба 3 minutes ago, popms said: у драфтсмана нет SDK. Драфтсман - это тоже по сути большой скрипт/плагин, который сам использует SDK альтиума. Это крайне неприятно. Т.е. рисовать что-то скриптами в документах драфтсмана не получается? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
popms 3 15 декабря, 2021 Опубликовано 15 декабря, 2021 · Жалоба 16 minutes ago, dee2mon said: Это крайне неприятно. Т.е. рисовать что-то скриптами в документах драфтсмана не получается? скриптами - точно нет плагином можно в теории, но это нужно декомпилировать dll драфтсмана, найти там метод рисования линии, посмотреть как он вызывается и написать в своем плагине обращение к dll драфтсмана и вызов рисования этой линии, но это не точно. И кстати нет никаких предпосылок к тому, что методы драфтсмана когда-либо появятся в SDK Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
peshkoff 24 15 декабря, 2021 Опубликовано 15 декабря, 2021 · Жалоба 2 hours ago, popms said: Драфтсман - это тоже по сути большой скрипт/плагин прикольно. хоть туда я и не лазил, т.к. драфтсман ни разу в жизни не открывал, но все равно удивительно. 2 hours ago, dee2mon said: На сайте актуального ничего нет по скриптам на альтиуме никогда ничего и не появится. спасибо праотцам, что вообще такую возможность сделали и написали хелп, этим хелпом 15 летней давности и приходится пользоваться. Теперяшние разработчики всё, что умеют это запретить эти скрипты нафик, уже по умолчанию все закрыто, кроме дельфи. Боюсь скоро и дельфи прикроют. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться