Перейти к содержанию
    

Как сохранить копию схемы в скрипте?

в теле скрипта?

что есть в скрипте уже? с этого надо начинать

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот (я подозреваю, что основа Вам знакома  :) )

 

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" у них, а подобного я не нашёл...

 

Изменено пользователем S17

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не, назнакома. Я тут подумал, что обычно кромсаю схемы и платы без сохранения копии :)))

ну короче, вы используете метод SaveToFile. Это не альтиумовская функция, а оригинальная от дельфи.

она позволяет текст Str, StringList и пр. сохранить в файл. не наш случай.

здесь нужно действовать через Client. или Workspase. и т.д.

т.е. с теми функциями, которые знают содержимое.

 

второй вариант: действовать через процессы. Все процессы, которые закреплены за кнопками можно писать в коде

    ResetParameters;
    AddStringParameter('ObjectKind','Document');
    AddStringParameter('SaveMode','SaveCopyAs');
    RunProcess('WorkspaceManager:SaveObject');
    ResetParameters;

это я скопировал из кнопки SaveAs. В таком виде будет появляться окно.

Можно покопаться поглубже и попробовать отключить окно, но что-то я сомневаюсь, что так можно сделать

 

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

На форму внедрить TSaveDialog, там сразу будет доступ к куче вариантов сохранения (вроде. сто лет не использовал уже)

 

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

блин... думаю самый простой вариант:

использовать движок дельфи для работы с файлами

image.thumb.png.5ef3d18b049ec4f79d81d011c0f6cde2.png

https://space-base.ru/library/delphi/function-copyfile

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"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;

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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' будет сохранять только проектные файлы, а не все, какие открыты

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Благодарю!

Но в моём конкретном скрипте лучше подходит именно копирование исходного файла без учёта изменений: порой ручками тоже приходится что-то удалять/корректировать для ГОСТовской распечатки, но не для сохранения!, и бывает, что это происходит до работы этого скрипта - поэтому в этом скрипте для меня лучше сохраниться на уровне исходного файла.

Да и кнопки в Альтиуме сохранения файла и "File/Run Script.." находятся очень близко - один раз я промахнулся... и сохранил ГОСТовскую макулатуру...

 

Как оказалось, сохранить схему (или другой объект) с изменениями - это не особо очевидная операция в Альтиуме... 

Спасибо за предложенный способ! ХитрО :)

 

Хотел для версии 21.5 Альтиума пометить файл, изменённый скриптом, как изменённый (т.к. версия 21.5 не замечает эти изменения) - использовал "SchDocument.DocumentModifiedChanged()", но схемный файл почему-то "не покраснел" (ни при true, ни при false)... Я подумал, что если "насильно" пометить файл изменённым, то исходный тогда будет браться Альтиумом не из кэша, а уже из файла..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, S17 said:

...в моём конкретном скрипте лучше подходит...

Тогда запрос как минимум должен быть.

Нужно расчитывать на использование еще кем либо. Должно все быть максимально юзабельно и прозрачно (а не как у программистов из альтиума).

Да и сам обычно забываешь через какое то время что там делается "автоматически"

Если схема правилась, то нужно спросить "Желаем сохраниться или нет?"

1 hour ago, S17 said:

"File/Run Script.."

Кнопку на панель для скрипта надо вытащить

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чуть в сторону еще вопрос по скриптам. А до SDK для драфтсмана кто-нибудь смог добраться? На сайте актуального ничего нет или я ничего не смог найти..

Есть некоторые задачи по автоматизации рисования чертежей, особенно в части установочных видов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Just now, dee2mon said:

Чуть в сторону еще вопрос по скриптам. А до SDK для драфтсмана кто-нибудь смог добраться? На сайте актуального ничего нет или я ничего не смог найти..

Есть некоторые задачи по автоматизации рисования чертежей, особенно в части установочных видов.

у драфтсмана нет SDK. Драфтсман - это тоже по сути большой скрипт/плагин, который сам использует SDK альтиума.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, popms said:

у драфтсмана нет SDK. Драфтсман - это тоже по сути большой скрипт/плагин, который сам использует SDK альтиума.

Это крайне неприятно. Т.е. рисовать что-то скриптами в документах драфтсмана не получается?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 minutes ago, dee2mon said:

Это крайне неприятно. Т.е. рисовать что-то скриптами в документах драфтсмана не получается?

скриптами - точно нет

 

плагином можно в теории, но это нужно декомпилировать dll драфтсмана, найти там метод рисования линии, посмотреть как он вызывается и написать в своем плагине обращение к dll драфтсмана и вызов рисования этой линии, 

но это не точно.

 

И кстати нет никаких предпосылок к тому, что методы драфтсмана когда-либо появятся в SDK

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, popms said:

Драфтсман - это тоже по сути большой скрипт/плагин

прикольно. 

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

2 hours ago, dee2mon said:

На сайте актуального ничего нет

по скриптам на альтиуме никогда ничего и не появится. спасибо праотцам, что вообще такую возможность сделали и написали хелп, этим хелпом 15 летней давности и приходится пользоваться.

Теперяшние разработчики всё, что умеют это запретить эти скрипты нафик, уже по умолчанию все закрыто, кроме дельфи. Боюсь скоро и дельфи прикроют.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...