Access Violation в TsgCADtoDXF.Create(..)
Access Violation в TsgCADtoDXF.Create(..)
Добрый день, коллеги.
Стоит задача слияния нескольких dxf-файлов в один.
Графика как таковая не интересует, просмотрщики и редакторы внешние.
Есть тестовое приложение с таким кодом:
В строке
нарываюсь на Access violation
Я уже видел на вашем форуме похожие топики, ответа для себя не нашел.
Кстати,
срабатывает, совмещенный рисунок отображается нормально.
В тоже время, код AddXRefClick из вашего GettingStarted при добавлении в него ExpObj работает без ошибок и dxf
создается корректно.
Чисто визуально, разница выражается в начале вашей процедуры:
Я что-то делаю неправильно. Всвязи с этим, несколько вопросов:
1) С TsgCADdxfImage бессмысленно работать без LoadFromFile? т.е
2) Программное наполнение и манипуляция с элементами вновь создаваемого dxf ведется только через TsgDXFExport?
3) Пожалуйста, посоветуйте оптимальный путь решения задачи создания НОВОГО dxf-файла из нескольких других.
Например, некоторые слои из исходных документов будут формировать конечный файл.
Спасибо.
Стоит задача слияния нескольких dxf-файлов в один.
Графика как таковая не интересует, просмотрщики и редакторы внешние.
Есть тестовое приложение с таким кодом:
Code: Select all
procedure TFrmMain.sxfMergeAsAddScaledDxf;
var
Pos1, Scale1: TFPoint;
Pos2, Scale2: TFPoint;
TargetPath : String;
ExpObj : TsgCADtoDXF;
begin
if not luFileNameIsValid(edTarget.Text) then begin
frmMemoLog('Target file name is not valid');
exit;
end;
TargetPath := glbPathApp + ExtractFileName(edTarget.Text) + '.dxf';
dxfResetImage(FDxfTarget);
Pos1.X := 10.0;
Pos1.Y := 10.0;
Scale1.X := 1;
Scale1.Y := 1;
Scale2.X := 1;
Scale2.Y := 1;
Pos2.X := -10.0;
Pos2.Y := -10.0;
FDxfTarget.AddScaledDXF(FDxfSource1, 'XREF1', Pos1, Scale1, 0);
FDxfTarget.AddScaledDXF(FDxfSource2, 'XREF2', Pos2, Scale2, 0);
FDxfTarget.GetExtents();
ImgTarget.Picture.Assign(FDxfTarget);
ExpObj := TsgCADtoDXF.Create(FDxfTarget);
try
ExpObj.SaveToFile(TargetPath);
finally
ExpObj.Free();
end;
end;
В строке
Code: Select all
ExpObj := TsgCADtoDXF.Create(FDxfTarget);
Я уже видел на вашем форуме похожие топики, ответа для себя не нашел.
Кстати,
Code: Select all
ImgTarget.Picture.Assign(FDxfTarget);
В тоже время, код AddXRefClick из вашего GettingStarted при добавлении в него ExpObj работает без ошибок и dxf
создается корректно.
Чисто визуально, разница выражается в начале вашей процедуры:
Code: Select all
vCADContainer.LoadFromFile('Entities.dxf'); // Base file
1) С TsgCADdxfImage бессмысленно работать без LoadFromFile? т.е
2) Программное наполнение и манипуляция с элементами вновь создаваемого dxf ведется только через TsgDXFExport?
3) Пожалуйста, посоветуйте оптимальный путь решения задачи создания НОВОГО dxf-файла из нескольких других.
Например, некоторые слои из исходных документов будут формировать конечный файл.
Спасибо.
Re: Access Violation в TsgCADtoDXF.Create(..)
Здравствуйте.
Приносим наши извинения за длительное молчание по вашему вопросу.
CAD Import VCL предоставляет базовый класс TsgCADImage, который рекомендуется использовать для создания нового чертежа:Для импорта чертежей TsgCADImage использоваться не должен. Используется один из классов наследников: TsgCADdxfImage для DXF формата, TsgDWGImage для DWG и т.п. Далее загружается чертёж с использованием LoadFromFile.
Метод AddScaledDXF добавляет на чертёж XREF объект. Этот объект является вставкой внешнего чертежа. После сохранения FDxfTarget, который содержит внешнюю ссылку, файл внешней ссылки должен присутствовать по заданному пути, например:Задание 'XREF1' в качестве второго аргумента метода неверно.
Александр.
Приносим наши извинения за длительное молчание по вашему вопросу.
Поскольку ExpObj объявлен как TsgCADtoDXF, то AV при вызове конструктора может быть только из-за некорректного аргумента FDxfTarget. К сожалению из вашего кода не видно процесса создания/загрузки этого объекта.В строкенарываюсь на Access violationCode: Select all
Code: Select all ExpObj := TsgCADtoDXF.Create(FDxfTarget);
CAD Import VCL предоставляет базовый класс TsgCADImage, который рекомендуется использовать для создания нового чертежа:
Code: Select all
FDxfTarget := TsgCADImage.Create();
FDxfTarget.Converter.InitializeSections();
FDxfTarget.CurrentLayout := FDxfTarget.Layouts[0];
Метод AddScaledDXF добавляет на чертёж XREF объект. Этот объект является вставкой внешнего чертежа. После сохранения FDxfTarget, который содержит внешнюю ссылку, файл внешней ссылки должен присутствовать по заданному пути, например:
Code: Select all
FDxfTarget.AddScaledDXF(FDxfSource1, 'd:\files\file2.dwg', Pos1, Scale1, 0);
TsgDXFExport это также класс, используемый для экспорта чертежей, альтернативный TsgCADtoDXF. Мы не рекомендуем использовать этот класс. Манипуляция с элементами создаваемого чертежа должна вестись через класс TsgCADImage с последующим экспортом через TsgCADtoDXF.2) Программное наполнение и манипуляция с элементами вновь создаваемого dxf ведется только через TsgDXFExport?
Если вы не хотите пользоваться методом AddScaledDXF, то альтернативно можно создать новый TsgCADImage, выполнить создание на нём новых примитивов и копирование с использованием AssignEntity свойств примитивов с другого чертежа. При этом должны быть скопированы также все требуемые стили и блоки.3) Пожалуйста, посоветуйте оптимальный путь решения задачи создания НОВОГО dxf-файла из нескольких других.
Например, некоторые слои из исходных документов будут формировать конечный файл.
Александр.
Technical Support E-mail: support@cadsofttools.com
Chat support on Skype: cadsofttools.support
Chat support on Skype: cadsofttools.support