сохранить в формат DXF версии 2000

Автор EKosarev, 23.12.20, 15:49:23

« предыдущая - следующая »

0 Пользователей и 1 гость просматривают эту тему.

EKosarev

Если кто знает как это написать помогите.
Я разберусь рано или поздно выложу суда готовый и подробно описанный вариант.
А пока прошу вас поделиться мнением о том как это правильно сделать, буду рад любому объяснению и помощи.

VIO

"Сохранить как" выбираете расширение dxf
Жмете на Параметры выбираете версию Автокада.
Всё.
См. вложение

Sabahs

23.12.20, 21:11:56 #2 Последнее редактирование: 23.12.20, 21:25:29 от Sabahs
Цитата: EKosarev от 23.12.20, 15:49:23Если кто знает как это написать помогите.
Я разберусь рано или поздно выложу суда готовый и подробно описанный вариант.
А пока прошу вас поделиться мнением о том как это правильно сделать, буду рад любому объяснению и помощи.
Уважаемый, Владимир Иванович, напишите ему код, он его не поймет, но напишет, что разобрался.

Вират Лакх

AutoCAD = {2000:4, 2004:5, 2007:6, 2010:7, 2013:8, 2018:9} # Поддерживаемые версии DXF/DWG
iConverter = iApplication.Converter(KompasObject.ksSystemPath(1) + '\\ImpExp\\dwgdxfExp.rtw') # Конвертер файлов КОМПАС
iConverterParameters = iConverter.ConverterParameters(1) # Получить интерфейс параметров конвертирования (для dxf: command = 1)
currentAcadFileVersion = iConverterParameters.AcadFileVersion # Сохранить текущую версию формата dxf
iConverterParameters.AcadFileVersion = AutoCAD[2000] # Версия AutoCAD, в которую осуществляем запись
iConverter.Convert('', fullpath, 1, False): # Процесс конвертации (файл или текущий документ, новый файл, номер команды, диалог)
iConverterParameters.AcadFileVersion = currentAcadFileVersion # Вернуть текущую версию формата dxf

Sabahs

Цитата: EKosarev от 23.12.20, 15:49:23Если кто знает как это написать помогите.
Я разберусь рано или поздно выложу суда готовый и подробно описанный вариант.
А пока прошу вас поделиться мнением о том как это правильно сделать, буду рад любому объяснению и помощи.
Код, Вам дали, полный.
Цитата: Вират Лакх от 24.12.20, 06:21:20AutoCAD = {2000:4, 2004:5, 2007:6, 2010:7, 2013:8, 2018:9} # Поддерживаемые версии DXF/DWG
iConverter = iApplication.Converter(KompasObject.ksSystemPath(1) + '\\ImpExp\\dwgdxfExp.rtw') # Конвертер файлов КОМПАС
iConverterParameters = iConverter.ConverterParameters(1) # Получить интерфейс параметров конвертирования (для dxf: command = 1)
currentAcadFileVersion = iConverterParameters.AcadFileVersion # Сохранить текущую версию формата dxf
iConverterParameters.AcadFileVersion = AutoCAD[2000] # Версия AutoCAD, в которую осуществляем запись
iConverter.Convert('', fullpath, 1, False): # Процесс конвертации (файл или текущий документ, новый файл, номер команды, диалог)
iConverterParameters.AcadFileVersion = currentAcadFileVersion # Вернуть текущую версию формата dxf
Евгений Сергеевич, порадуйте нас, если не получилось, тоже, не стесняйтесь, но полный проект, можно посмотреть?

VIO

Цитата: Sabahs от 23.12.20, 21:11:56Уважаемый, Владимир Иванович, напишите ему код, он его не поймет, но напишет, что разобрался.
Пардон извиняюсь опять не свою тему влез.

EKosarev

как то так все выглядит я беру 3д модель переношу её на 2д делаю развертку соглашаюсь с изменениями сохраняю все и закрываю.
все это я собрал тут на форуме
Владимир Сергеевич вот предоставил код. я в общих чертах его понимаю кроме строк непосредственно с autoCAD, currentAcadFileVersion(autoCAD например какого он типа ? его вообще нужно как переменную указывать?), остальное вот второй день ковыряю пытаюсь разобраться с помощью SDK но SDK этот тот еще барьер, я не больно понимаю как получить одно свойство от другого, такие вот дела
procedure TForm1.btn7Click(Sender: TObject);
var
convert:IConverter;
myPart: ksPart;
MPar: ksMassInertiaParam;
Doc: ksDocument3D;
Kompas: KompasObject;
Kompas7: IApplication;
newKompasAPI : IApplication;
f: TextFile;
fname:string;
iAssociationViewParam: ksAssociationViewParam;
iViewParam: ksViewParam;
ViewNumber:Integer;
disp : IDispatch;
pKompasDocument : IKompasDocument;
pKompasDocument2D : IKompasDocument2D;
pViewsAndLayersManager : IViewsAndLayersManager;
pViews : IViews;
pView : IView;
pAssociationView:IAssociationView;
pViewDesignation:IViewDesignation;
hide:ksHideMessageEnum;
begin
   Kompas:= KompasObject(createOleObject('Kompas.Application.5'));
   if dlgOpen1.Execute then
   fname:=dlgOpen1.FileName;
begin
           Doc:=ksDocument3D(Kompas.Document3D);                                      //интерфейс документа
           doc.Open(dlgOpen1.FileName,False);
   Kompas7:=GetActiveOleObject('Kompas.Application.7') as iApplication;

  disp:=IDispatch(Kompas7);
  kompas7.Visible:=True;
  DocumentParam:=ksDocumentParam(Kompas.GetParamStruct(ko_DocumentParam));
  DocumentParam.Init();
  DocumentParam.type_:=lt_DocSheetStandart;

 Document2D:=ksDocument2D(Kompas.Document2D);
 Document2D.ksCreateDocument(DocumentParam);

  iAssociationViewParam:=ksAssociationViewParam(Kompas.GetParamStruct(ko_AssociationViewParam));
  iAssociationViewParam.Init();
  iAssociationViewParam.disassembly:=False;
  iAssociationViewParam.fileName:= dlgOpen1.FileName;
  iAssociationViewParam.projectionName:='#Развертка';
  iAssociationViewParam.projBodies:=True;
  iAssociationViewParam.projSurfaces:=False;

  iViewParam:=ksViewParam(iAssociationViewParam.GetViewParam());
  iViewParam.Init();

  ViewNumber:=0;
  Document2D.ksCreateSheetArbitraryView(iAssociationViewParam, ViewNumber);


  newKompasAPI:=disp As IApplication;
  newKompasAPI.HideMessage:=ksHideMessageYes  ;                                   
  pKompasDocument2D :=  Kompas7.ActiveDocument as iKompasDocument2D;
  pViewsAndLayersManager := pKompasDocument2D.ViewsAndLayersManager;
  pViews := pViewsAndLayersManager.Views;
  pView := pViews.View[1];
  Document2D.ksGetObjParam(pView.Reference, iAssociationViewParam, ASSOCIATION_VIEW_PARAM);

  pAssociationView := pView as IAssociationView;
  pAssociationView.Set_Unfold(True);
  pAssociationView.Set_BendLinesVisible(True);

  pViewDesignation := pView as IViewDesignation;
  pViewDesignation.Set_ShowUnfold(True);

  pView.Update;
  Document2D.ksRebuildDocument();

 pKompasDocument2D :=  Kompas7.ActiveDocument as iKompasDocument2D;        //сохраняю в DXF
 Document2D.ksSaveToDXF(fname+ 'развертка.dxf');
 Document2D.ksCloseDocument;
 Kompas7.Quit;

end;
end;

Sabahs

Уже показывал какого он типа https://forum.ascon.ru/index.php?topic=25301.msg279917#msg279917.
Сгенерируйте модуль ACADEXPORTLib_TLB.pas и посмотрите.
DXF_L.png
Зачем столько раз интерфейс получать?
Kompas7:=GetActiveOleObject('Kompas.Application.7') as iApplication;
disp:=IDispatch(Kompas7);
newKompasAPI:=disp As IApplication;
newKompasAPI.HideMessage:=ksHideMessageYes; - флаг поменяли, а где вернули назад, он влияет на работу КОМПАС-3D.

Такое впечатление, что Вы просто куски кода выдергиваете, но в него не вникаете, Ваши четыре строки.
Kompas7:=GetActiveOleObject('Kompas.Application.7') as iApplication;
Kompas7.HideMessage:=ksHideMessageYes;

EKosarev

25.12.20, 08:42:56 #8 Последнее редактирование: 25.12.20, 08:56:35 от EKosarev
Я вот поменял флаг, подумал что при закрытии компаса, эта настройка слетает обратно и не стал менять назад.
я не знаю почему я пробовал менять флаг на интерфейс kompas7 и не вышло а когда newkompasAPI получил с ним смог поменять флаг
ну я вник в код насколько смог я когда его собирал только начинал знакомиться с API в целом  ну а сейчас к нему не возвращался так как работает, хотя наверное стоит на его примере по разбираться. а то я в каком то тупике если честно

я сгенерировал да этот модуль,  получается что  __MIDL___MIDL_itf_ACADExport_0000_0000_0001 тип этой переменной

Sabahs

Тип - TOleEnum, а имя можно и поменять.
DXF_1.png

EKosarev

я получается объявляю переменую Acad:TOleEnum потом приравниваю её Acad:=ksAutocad_v15

currentAcadFileVersion а эту я объявляю как ksautoсadfileversionEnum или что это вообще такое ?

Sabahs


EKosarev

спасибо большое, начал читать, надеюсь это ускорит дело, изучу за сегодня завтра

Вират Лакх

Цитата: EKosarev от 25.12.20, 08:04:26я в общих чертах его понимаю кроме строк непосредственно с autoCAD, currentAcadFileVersion(autoCAD например какого он типа ? его вообще нужно как переменную указывать?)
AutoCAD = {2000:4, 2004:5, 2007:6, 2010:7, 2013:8, 2018:9} - это словарь в питоне, т.е. прописано, какой версии соответствует какая константа.
currentAcadFileVersion - просто переменная целочисленного типа для хранения и восстановления исходной версии dxf; можно этим не пользоваться.
AutoCAD[2000] - обращение к словарю, т.е. в iConverterParameters.AcadFileVersion присваивается 4.

EKosarev

iConverterParameters
AcadFileVersion
я не могу к этим вещам обратится может какой то библиотеки не хватает или что

Sabahs

Вы считаете, что тут все экстрасенсы?
Прикрепите полностью проект, тогда можно будет посмотреть, что не хватает.

EKosarev

проект вот таков unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
  LDefin3d, LDefin2d, KSauto, KsTLB,
  Forms,
  Dialogs, StdCtrls, ExtCtrls, ComCtrls, Grids, DBGrids, DB, DBTables,
  Mask, DBCtrls, Buttons, OleCtnrs, ComObj, ActiveX, ksConstTLB, ksAPI7, Registry, OPConvert, ACADEXPORTLib_TLB;

type
  TForm1 = class(TForm)
    btn1: TButton;
    lbl1: TLabel;
    dlgOpen1: TOpenDialog;
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
   kompas:KompasObject;
  kompas7:IApplication;

procedure TForm1.btn1Click(Sender: TObject);
var
  kompas7:IApplication;
  doc:ksDocument2D;
  pdoc:ksDocumentParam;
  con:IConverter;
    patch:string;
   fname:string;
   autocad:TOleEnum;
begin
   if dlgOpen1.Execute then
       fname:=dlgOpen1.FileName;
       if fname<>'' then
          begin
           kompas:=KompasObject(CreateOleObject('kompas.application.5'))   ;
           kompas.Visible:=True;
           pdoc:=ksDocumentParam(kompas.GetParamStruct(ko_DocumentParam));
           pdoc.type_:=ksDocumentDrawing;

           doc:=ksDocument2D(kompas.Document2D);
           doc.ksOpenDocument( dlgOpen1.FileName, false );

           kompas7:=getactiveoleobject('kompas.Application.7') as IApplication;

           patch:='C:\Program Files\ASCON\KOMPAS-3D v19\Libs\ImpExp\dwgdxfExp.rtw';
           con:=kompas7.Converter[patch];
           con.ConverterParameters(1);
           con.Convert(fname,fname+'.dxf',1,False);
          end;
          end;
end.

Sabahs

Вы видели в каком виде примеры в SDK?
Проект, значит все файлы, чтобы его можно было открыть и скомпилировать.
Где тут iConverterParameters и AcadFileVersion?

Par:=con.ConverterParameters(1) as iConverterParameters;
Par.AcadFileVersion:=...;

EKosarev

Делфи подсказывает обычно когда правильно пишешь.
Я пытаюсь ввести iConverterParameters и AcadFileVersion он не знает таких
https://yadi.sk/d/hE0RYeN9br_E9Q?w=1 суда закинул проект

Sabahs

Яндекс диск мне не доступен? Да и архив проекта спокойно можно прикрепить к сообщению.