/
YakuninAV
/
Convertors
Обзор
Документация
Войти
/
YakuninAV
/
Convertors
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
Estimate/EstConvertors.pas
273 строки
15 KB
YakuninAV
begin with gitflick
31 июл 2026, 15:21
31 июл 2026, 15:21
1dc0fc6
Код
Авторство
О чём код?
unit EstConvertors; {$I mormot.defines.inc} interface uses {$IFDEF ISDELPHIXE2} System.SysUtils, {$ELSE} SysUtils, dialogs, {$ENDIF} mormot.core.base, mormot.core.variants, mormot.core.unicode, mormot.core.os, mormot.core.text, DBDIntfs, EstTypes ; //---------------------------------------------------------------------------------------------------------------------------------- // Преобразование смет между прикладными форматами //---------------------------------------------------------------------------------------------------------------------------------- /// Функция выполняет преобразование файла в формате ESW в формат GGE, в случае успешого преобразования функция возвращает true // SrcFile - исходный файл, содержащий смету в формате Турбосметчика (ESW) // DstFile - файл для сохранения результата преобразования в формате ГлавГосЭкспертизы (GGE) // Options - дополнительные опции преобразования // Notifier - интерфейс регистратора сообщений function DoConvertEswToGge(const SrcFile, DstFile: string; const Options: Variant; const Notifier: IDBDNotifierV1=nil): Boolean; function DoConvertEswToGge2(const SrcFile, DstFile: string; const Options: Variant; const Notifier: IDBDNotifierV1=nil): Boolean; /// Функция выполняет преобразование файла в формате GGE в формат ESW, в случае успешого преобразования функция возвращает true // SrcFile - исходный файл, содержащий смету в формате ГлавГосЭкспертизы (GGE) // DstFile - файл для сохранения результата преобразования в формате Турбосметчика (ESW) // Options - дополнительные опции преобразования // Notifier - интерфейс регистратора сообщений function DoConvertGgeToEsw(const SrcFile, DstFile: string; const Options: Variant; const Notifier: IDBDNotifierV1=nil): Boolean; //---------------------------------------------------------------------------------------------------------------------------------- // Преобразование смет из прикладных в промежуточный //---------------------------------------------------------------------------------------------------------------------------------- function DoConvertEswToEdj(const SrcFile: string; var Edj: RawUTF8; const Options: Variant; const Notifier: IDBDNotifierV1=nil): Boolean; overload; function DoConvertGgeToEdj(const SrcFile: string; var Edj: RawUTF8; const Options: Variant; const Notifier: IDBDNotifierV1=nil): Boolean; overload; //---------------------------------------------------------------------------------------------------------------------------------- // Преобразование смет из промежуточного формата в прикладные //---------------------------------------------------------------------------------------------------------------------------------- function DoConvertEdjToEsw(const Edj: RawUTF8; const DstFile: string; const Options: Variant; const Notifier: IDBDNotifierV1=nil): Boolean; overload; function DoConvertEdjToGge(const Edj: RawUTF8; const DstFile: string; const Options: Variant; const Notifier: IDBDNotifierV1=nil): Boolean; overload; //---------------------------------------------------------------------------------------------------------------------------------- // Преобразование смет между промежуточным форматом и форматом JSON-форматом Турбосметы //---------------------------------------------------------------------------------------------------------------------------------- function DoConvertEdjToTsj(const Src: RawUTF8; out Dst: RawUTF8; const Options: Variant; const Notifier: IDBDNotifierV1=nil): Boolean; overload; function DoConvertEdjToTsf(const Src: RawUTF8; out Dst: RawUTF8; const Options: Variant; const Notifier: IDBDNotifierV1=nil): Boolean; overload; function DoConvertTsjToEdj(const Src: RawUTF8; out Dst: RawUTF8; const Options: Variant; const Notifier: IDBDNotifierV1=nil): Boolean; overload; function DoConvertTsfToEdj(const Src: RawUTF8; out Dst: RawUTF8; const Options: Variant; const Notifier: IDBDNotifierV1=nil): Boolean; overload; implementation uses EstIntfsV2, EstDocuments, RDB2_EstDocuments, EswReaders, EswWriters, GGEEstWriterBases, GGEEstWritersV2, GGEEstReaderBases; procedure Notify(Notifier: IDBDNotifierV1; const msgKind: TDBDMessageKind; const msgText: string); inline; begin if Notifier<>nil then Notifier.Log(msgKind, 0, msgText); end; //---------------------------------------------------------------------------------------------------------------------------------- // Преобразование смет из прикладных в промежуточный //---------------------------------------------------------------------------------------------------------------------------------- function DoConvertEswToEdj(const SrcFile: string; var Doc: IEstimateDocumentV2; const Options: Variant; const Notifier: IDBDNotifierV1=nil): Boolean; overload; var rdr: IEstimateReaderV2; r: rawUTF8; printEdj: Boolean; v: Variant; begin rdr:=TEswReaderV5.Create(Options, Notifier); if _Safe(Options)^.GetAsRawUtf8(BooksJName, r) then TRDBEstDocument.BooksDirectory:=UTf8ToString(r); Doc:=TEstimateDocument.Create; Result := rdr.Read(SrcFile, Doc); if (Result and _Safe(Options)^.GetAsBoolean(flagEdjJName, printEdj) and printEdj) then begin v:=Doc.ToDoc; r:=TDocVariantData(v).ToJson('','',jsonCompact); {$IFDEF DEBUG} FileFromString(r, srcFile + '.edj', True); {$ENDIF} TDocVariantData(v).Clear; end; end; function DoConvertEswToEdj(const SrcFile: string; var Edj: RawUTF8; const Options: Variant; const Notifier: IDBDNotifierV1=nil): Boolean; overload; var doc:IEstimateDocumentV2; v: Variant; begin Doc:=TEstimateDocument.Create; Result := DoConvertEswToEdj(SrcFile,doc,Options,Notifier); if Result then begin v:=Doc.ToDoc; Edj:=_Safe(v)^.ToJSON; TDocVariantData(v).Clear; end; end; function DoConvertGgeToEdj(const SrcFile: string; var Doc: IEstimateDocumentV2; const Options: Variant; const Notifier: IDBDNotifierV1=nil): Boolean; overload; var rdr: IEstimateReaderV2; r: RawUtf8; v: Variant; printEdj: Boolean; begin Result:=False; if SrcFile = '' then begin Notify(Notifier, dmkErrorInfo, 'Имя файла с XML-сметой должно быть задано'); end else if not FileExists(SrcFile) then begin Notify(Notifier, dmkErrorInfo, 'Файл с XML-сметой (" ' + SrcFile + '") не найден'); end else begin rdr:=TGGEReaderBase.Create(Options, Notifier); Doc:=TEstimateDocument.Create; Result := rdr.Read(SrcFile, Doc); if (Result and _Safe(Options)^.GetAsBoolean(flagEdjJName, printEdj) and printEdj) then begin v:=Doc.ToDoc; r:=TDocVariantData(v).ToJson('','',jsonCompact); {$IFDEF DEBUG} FileFromString(r, srcFile + '.edj', True); {$ENDIF} TDocVariantData(v).Clear; end; end; end; function DoConvertGgeToEdj(const SrcFile: string; var Edj: RawUTF8; const Options: Variant; const Notifier: IDBDNotifierV1=nil): Boolean; overload; var v: Variant; doc:IEstimateDocumentV2; begin doc:=TEstimateDocument.Create; if DoConvertGgeToEdj(SrcFile, doc, Options, Notifier) then begin v:=doc.ToDoc; Edj := _Safe(v)^.ToJSON; TDocVariantData(v).Clear; Result := True; end else Result := False; end; //---------------------------------------------------------------------------------------------------------------------------------- // Преобразование смет из промежуточного формата в прикладные //---------------------------------------------------------------------------------------------------------------------------------- function DoConvertEdjToGge(Doc: IEstimateDocumentV2; const DstFile: string; const Options: Variant; const Notifier: IDBDNotifierV1=nil): Boolean; overload; var wrt: IEstimateWriterV2; r: RawUTF8; begin Result := Doc.Constructions[0].Objects[0].Estimate[0].Kind = ekMDS421pr; if Result then begin // Result := Doc.Constructions[0].Objects[0].Estimate[0].IndexType = eitUnified; // if not Result then Notify(Notifier, dmkErrorInfo, 'Смета МДС-421пр должна использовать индексы СМР'); end else Notify(Notifier, dmkErrorInfo, 'Смета должна быть составлена по требованиям МДС-421пр'); if not Result then Exit; Result := False; if _Safe(Options)^.GetAsRawUtf8(SchemaJName, r) then begin TGGEWriterBase.SchemaFile:=UTf8ToString(r); wrt := TGGEWriterBase.Create(Options, Notifier); Result := wrt.Write(DstFile, Doc); if not Result then Notify(Notifier, dmkErrorInfo, 'Ошибки при формировании GGE'); end else Notify(Notifier, dmkErrorInfo, 'Имя файла со схемой XML-файла сметы должно быть задано в опциях конвертации'); end; function DoConvertEdjToGge2(Doc: IEstimateDocumentV2; const DstFile: string; const Options: Variant; const Notifier: IDBDNotifierV1=nil): Boolean; overload; var wrt: IEstimateWriterV2; r: RawUTF8; begin Result := Doc.Constructions[0].Objects[0].Estimate[0].Kind = ekMDS421pr; if Result then begin // Result := Doc.Constructions[0].Objects[0].Estimate[0].IndexType = eitUnified; // if not Result then Notify(Notifier, dmkErrorInfo, 'Смета МДС-421пр должна использовать индексы СМР'); end else Notify(Notifier, dmkErrorInfo, 'Смета должна быть составлена по требованиям МДС-421пр'); if not Result then Exit; Result := False; if _Safe(Options)^.GetAsRawUtf8(SchemaJName, r) then begin TGGEstWriterV2.SchemaFile:=UTf8ToString(r); wrt := TGGEstWriterV2.Create(Options, Notifier); Result := wrt.Write(DstFile, Doc); if not Result then Notify(Notifier, dmkErrorInfo, 'Ошибки при формировании GGE'); end else Notify(Notifier, dmkErrorInfo, 'Имя файла со схемой XML-файла сметы должно быть задано в опциях конвертации'); end; function DoConvertEdjToGge(const Edj: RawUTF8; const DstFile: string; const Options: Variant; const Notifier: IDBDNotifierV1=nil): Boolean; var doc:IEstimateDocumentV2; t: TDocVariantData; begin Result:=False; if (Edj<>'') and t.InitJson(Edj) then begin doc := TEstimateDocument.Create(Notifier); if doc.FromDoc(@t) then Result := DoConvertEdjToGge(doc,DstFile, Options, Notifier) else Notify(Notifier, dmkErrorInfo, 'JSON-строка не содержит смету'); end; end; function DoConvertEdjToEsw(Doc: IEstimateDocumentV2; const DstFile: string; const Options: Variant; const Notifier: IDBDNotifierV1=nil): Boolean; overload; var wrt: IEstimateWriterV2; r:RawUTF8; fn: string; begin if _Safe(Options)^.GetAsRawUtf8(SchemaJName, r) then TGGEWriterBase.SchemaFile:=UTf8ToString(r); if _Safe(Options)^.GetAsRawUtf8(TmpltJName, r) then fn := UTF8ToString(r) else fn := IncludeTrailingPathDelimiter(ExeVersion.ProgramFilePath)+'Template\Шаблон 421пр базисно-индексный.etw'; wrt:=TEswWriterV5.Create(Options, Notifier, fn); Result := wrt.Write(DstFile, Doc); end; function DoConvertEdjToEsw(const Edj: RawUTF8; const DstFile: string; const Options: Variant; const Notifier: IDBDNotifierV1=nil): Boolean; overload; var doc:IEstimateDocumentV2; t: TDocVariantData; begin Result := False; if (Edj<>'') and t.InitJson(Edj) then begin doc := TEstimateDocument.Create(Notifier); if doc.FromDoc(@t) then Result := DoConvertEdjToEsw(doc,DstFile, Options, Notifier) else Notify(Notifier, dmkErrorInfo, 'JSON-строка не содержит смету'); end; end; //---------------------------------------------------------------------------------------------------------------------------------- // Преобразование смет между прикладными форматами //---------------------------------------------------------------------------------------------------------------------------------- function DoConvertEswToGge(const SrcFile, DstFile: string; const Options: Variant; const Notifier: IDBDNotifierV1=nil): Boolean; var Doc :IEstimateDocumentV2; begin Doc:=TEstimateDocument.Create; Result := DoConvertEswToEdj(SrcFile, Doc, Options, Notifier) and DoConvertEdjToGge(Doc, DstFile, Options, Notifier); end; function DoConvertEswToGge2(const SrcFile, DstFile: string; const Options: Variant; const Notifier: IDBDNotifierV1=nil): Boolean; var Doc :IEstimateDocumentV2; begin Doc:=TEstimateDocument.Create; Result := DoConvertEswToEdj(SrcFile, Doc, Options, Notifier) and DoConvertEdjToGge2(Doc, DstFile, Options, Notifier); end; function DoConvertGgeToEsw(const SrcFile, DstFile: string; const Options: Variant; const Notifier: IDBDNotifierV1=nil): Boolean; var Doc:IEstimateDocumentV2; begin Result := DoConvertGgeToEdj(SrcFile, Doc, Options, Notifier) and DoConvertEdjToEsw(Doc, DstFile, Options, Notifier); end; //---------------------------------------------------------------------------------------------------------------------------------- // Преобразование смет между промежуточным форматом и форматом JSON-форматом Турбосметы //---------------------------------------------------------------------------------------------------------------------------------- function DoConvertEdjToTsj(const Src: RawUTF8; out Dst: RawUTF8; const Options: Variant; const Notifier: IDBDNotifierV1=nil): Boolean; overload; begin Result :=False; end; function DoConvertEdjToTsj(Doc: IEstimateDocumentV2; out Dst: RawUTF8; const Options: Variant; const Notifier: IDBDNotifierV1=nil): Boolean; overload; begin Result :=False; end; function DoConvertEdjToTsf(const Src: RawUTF8; out Dst: RawUTF8; const Options: Variant; const Notifier: IDBDNotifierV1=nil): Boolean; overload; begin Result :=False; end; function DoConvertEdjToTsf(Doc: IEstimateDocumentV2; out Dst: RawUTF8; const Options: Variant; const Notifier: IDBDNotifierV1=nil): Boolean; overload; begin Result :=False; end; function DoConvertTsjToEdj(const Src: RawUTF8; out Dst: RawUTF8; const Options: Variant; const Notifier: IDBDNotifierV1=nil): Boolean; overload; begin Result :=False; end; function DoConvertTsjToEdj(const Src: RawUTF8; var Doc: IEstimateDocumentV2; const Options: Variant; const Notifier: IDBDNotifierV1=nil): Boolean; overload; begin Result :=False; end; function DoConvertTsfToEdj(const Src: RawUTF8; out Dst: RawUTF8; const Options: Variant; const Notifier: IDBDNotifierV1=nil): Boolean; overload; begin Result :=False; end; function DoConvertTsfToEdj(const Src: RawUTF8; var Doc: IEstimateDocumentV2; const Options: Variant; const Notifier: IDBDNotifierV1=nil): Boolean; overload; begin Result :=False; end; end.