Access Violation в TsgCADtoDXF.Create(..)

Обсуждение вопросов экспорта в поддерживаемые форматы
Post Reply
Arts
Posts: 1
Joined: 12 Feb 2014, 16:25

Access Violation в TsgCADtoDXF.Create(..)

Post by Arts » 12 Feb 2014, 17:10

Добрый день, коллеги.
Стоит задача слияния нескольких 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);
нарываюсь на Access violation

Я уже видел на вашем форуме похожие топики, ответа для себя не нашел.

Кстати,

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-файла из нескольких других.
Например, некоторые слои из исходных документов будут формировать конечный файл.


Спасибо.

support
Posts: 2932
Joined: 30 Mar 2005, 11:36
Contact:

Re: Access Violation в TsgCADtoDXF.Create(..)

Post by support » 24 Mar 2014, 19:40

Здравствуйте.
Приносим наши извинения за длительное молчание по вашему вопросу.
В строке

Code: Select all

    Code: Select all
    ExpObj := TsgCADtoDXF.Create(FDxfTarget);
нарываюсь на Access violation
Поскольку ExpObj объявлен как TsgCADtoDXF, то AV при вызове конструктора может быть только из-за некорректного аргумента FDxfTarget. К сожалению из вашего кода не видно процесса создания/загрузки этого объекта.
CAD Import VCL предоставляет базовый класс TsgCADImage, который рекомендуется использовать для создания нового чертежа:

Code: Select all

  FDxfTarget := TsgCADImage.Create();
  FDxfTarget.Converter.InitializeSections();
  FDxfTarget.CurrentLayout := FDxfTarget.Layouts[0];
Для импорта чертежей TsgCADImage использоваться не должен. Используется один из классов наследников: TsgCADdxfImage для DXF формата, TsgDWGImage для DWG и т.п. Далее загружается чертёж с использованием LoadFromFile.

Метод AddScaledDXF добавляет на чертёж XREF объект. Этот объект является вставкой внешнего чертежа. После сохранения FDxfTarget, который содержит внешнюю ссылку, файл внешней ссылки должен присутствовать по заданному пути, например:

Code: Select all

FDxfTarget.AddScaledDXF(FDxfSource1, 'd:\files\file2.dwg', Pos1, Scale1, 0);
Задание 'XREF1' в качестве второго аргумента метода неверно.
2) Программное наполнение и манипуляция с элементами вновь создаваемого dxf ведется только через TsgDXFExport?
TsgDXFExport это также класс, используемый для экспорта чертежей, альтернативный TsgCADtoDXF. Мы не рекомендуем использовать этот класс. Манипуляция с элементами создаваемого чертежа должна вестись через класс TsgCADImage с последующим экспортом через TsgCADtoDXF.
3) Пожалуйста, посоветуйте оптимальный путь решения задачи создания НОВОГО dxf-файла из нескольких других.
Например, некоторые слои из исходных документов будут формировать конечный файл.
Если вы не хотите пользоваться методом AddScaledDXF, то альтернативно можно создать новый TsgCADImage, выполнить создание на нём новых примитивов и копирование с использованием AssignEntity свойств примитивов с другого чертежа. При этом должны быть скопированы также все требуемые стили и блоки.

Александр.
Technical Support E-mail: support@cadsofttools.com
Chat support on Skype: cadsofttools.support

Post Reply