Форум пользователей ПО АСКОН

Профессиональные вопросы => Программирование приложений => Delphi => Тема начата: EKosarev от 23.12.20, 15:49:23

Название: сохранить в формат DXF версии 2000
Отправлено: EKosarev от 23.12.20, 15:49:23
Если кто знает как это написать помогите.
Я разберусь рано или поздно выложу суда готовый и подробно описанный вариант.
А пока прошу вас поделиться мнением о том как это правильно сделать, буду рад любому объяснению и помощи.
Название: Re: сохранить в формат DXF версии 2000
Отправлено: VIO от 23.12.20, 16:09:47
"Сохранить как" выбираете расширение dxf
Жмете на Параметры выбираете версию Автокада.
Всё.
См. вложение
Название: Re: сохранить в формат DXF версии 2000
Отправлено: Sabahs от 23.12.20, 21:11:56
Цитата: EKosarev от 23.12.20, 15:49:23Если кто знает как это написать помогите.
Я разберусь рано или поздно выложу суда готовый и подробно описанный вариант.
А пока прошу вас поделиться мнением о том как это правильно сделать, буду рад любому объяснению и помощи.
Уважаемый, Владимир Иванович, напишите ему код, он его не поймет, но напишет, что разобрался.
Название: Re: сохранить в формат DXF версии 2000
Отправлено: Вират Лакх от 24.12.20, 06:21:20
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
Название: Re: сохранить в формат DXF версии 2000
Отправлено: Sabahs от 24.12.20, 16:27:34
Цитата: 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
Евгений Сергеевич, порадуйте нас, если не получилось, тоже, не стесняйтесь, но полный проект, можно посмотреть?
Название: Re: сохранить в формат DXF версии 2000
Отправлено: VIO от 24.12.20, 16:40:48
Цитата: Sabahs от 23.12.20, 21:11:56Уважаемый, Владимир Иванович, напишите ему код, он его не поймет, но напишет, что разобрался.
Пардон извиняюсь опять не свою тему влез.
Название: Re: сохранить в формат DXF версии 2000
Отправлено: EKosarev от 25.12.20, 08:04:26
как то так все выглядит я беру 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;
Название: Re: сохранить в формат DXF версии 2000
Отправлено: Sabahs от 25.12.20, 08:23:08
Уже показывал какого он типа 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;
Название: Re: сохранить в формат DXF версии 2000
Отправлено: EKosarev от 25.12.20, 08:42:56
Я вот поменял флаг, подумал что при закрытии компаса, эта настройка слетает обратно и не стал менять назад.
я не знаю почему я пробовал менять флаг на интерфейс kompas7 и не вышло а когда newkompasAPI получил с ним смог поменять флаг
ну я вник в код насколько смог я когда его собирал только начинал знакомиться с API в целом  ну а сейчас к нему не возвращался так как работает, хотя наверное стоит на его примере по разбираться. а то я в каком то тупике если честно

я сгенерировал да этот модуль,  получается что  __MIDL___MIDL_itf_ACADExport_0000_0000_0001 тип этой переменной
Название: Re: сохранить в формат DXF версии 2000
Отправлено: Sabahs от 25.12.20, 10:45:41
Тип - TOleEnum, а имя можно и поменять.
DXF_1.png
Название: Re: сохранить в формат DXF версии 2000
Отправлено: EKosarev от 25.12.20, 11:27:25
я получается объявляю переменую Acad:TOleEnum потом приравниваю её Acad:=ksAutocad_v15

currentAcadFileVersion а эту я объявляю как ksautoсadfileversionEnum или что это вообще такое ?
Название: Re: сохранить в формат DXF версии 2000
Отправлено: Sabahs от 25.12.20, 11:48:55
Вы лучше почитайте книги по языку.
Книга в двух томах выглядит так.
https://www.for-stydents.ru/informatika/delphi/uchebniki/delphi-5-rukovodstvo-razrabotchika-tom-1-osnovnye-metody-i-tehnologii-programmirovaniya.html
Название: Re: сохранить в формат DXF версии 2000
Отправлено: EKosarev от 25.12.20, 14:48:34
спасибо большое, начал читать, надеюсь это ускорит дело, изучу за сегодня завтра
Название: Re: сохранить в формат DXF версии 2000
Отправлено: Вират Лакх от 26.12.20, 05:46:28
Цитата: 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.
Название: Re: сохранить в формат DXF версии 2000
Отправлено: EKosarev от 15.01.21, 13:59:59
iConverterParameters
AcadFileVersion
я не могу к этим вещам обратится может какой то библиотеки не хватает или что
Название: Re: сохранить в формат DXF версии 2000
Отправлено: Sabahs от 15.01.21, 14:10:57
Вы считаете, что тут все экстрасенсы?
Прикрепите полностью проект, тогда можно будет посмотреть, что не хватает.
Название: Re: сохранить в формат DXF версии 2000
Отправлено: EKosarev от 15.01.21, 14:51:45
проект вот таков 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.
Название: Re: сохранить в формат DXF версии 2000
Отправлено: Sabahs от 15.01.21, 15:00:34
Вы видели в каком виде примеры в SDK?
Проект, значит все файлы, чтобы его можно было открыть и скомпилировать.
Где тут iConverterParameters и AcadFileVersion?

Par:=con.ConverterParameters(1) as iConverterParameters;
Par.AcadFileVersion:=...;
Название: Re: сохранить в формат DXF версии 2000
Отправлено: EKosarev от 15.01.21, 15:28:17
Делфи подсказывает обычно когда правильно пишешь.
Я пытаюсь ввести iConverterParameters и AcadFileVersion он не знает таких
https://yadi.sk/d/hE0RYeN9br_E9Q?w=1 суда закинул проект
Название: Re: сохранить в формат DXF версии 2000
Отправлено: Sabahs от 15.01.21, 15:33:16
Яндекс диск мне не доступен? Да и архив проекта спокойно можно прикрепить к сообщению.
Название: Re: сохранить в формат DXF версии 2000
Отправлено: Sabahs от 16.01.21, 12:14:54
Цитата: EKosarev от 15.01.21, 13:59:59iConverterParameters
AcadFileVersion
я не могу к этим вещам обратится может какой то библиотеки не хватает или что
Проблема.
SaveDXF.png
Название: Re: сохранить в формат DXF версии 2000
Отправлено: EKosarev от 18.01.21, 08:38:33
Ого, огромное спасибо, на многое открыли мне глаза, особенно по приведению к классу через оператор AS
И вот это для меня крутая фишкаi:=Length(fname);
        if i>3 then fSaveName:=Copy(fname,1,i-3)+'dxf';


сколько же мне еще учится
Название: Re: сохранить в формат DXF версии 2000
Отправлено: Петрович-47 от 18.01.21, 14:39:04
Только с этой "крутой фишкой" надо быть на стопроцентов уверенным что расширение у fname ЕСТЬ и что оно состоит из ТРЁХ символов.
А то мы имеем в семнадцатом компасе "крутой косяк" в диалоге "Сохранить как..." который СТП уже третий год исправлять не желает... и тоже наверняка в нём такой же подход без проверок...
Название: Re: сохранить в формат DXF версии 2000
Отправлено: Sabahs от 18.01.21, 16:31:11
Для этого фильтр есть, какие файлы открывать.
Filter.png
Название: Re: сохранить в формат DXF версии 2000
Отправлено: Петрович-47 от 18.01.21, 18:53:03
Я имел ввиду не конкретно К, а то что в программировании такой прямолинейный подход без предварительной проверки, может применяться только если Вы на стопроцентов ЗНАЕТЕ... иначе кто-нибудь обязательно Вам подложит грабли - как я уже привёл пример диалога "Сохранить как..." - при разных настройках ОС и результат разный...
Название: Re: сохранить в формат DXF версии 2000
Отправлено: lavgirb от 04.11.23, 13:15:45
Цитата: Вират Лакх от 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
Спасибо.
Вират Лакх, не подскажете, где посмотреть другие настройки при экспорте в DWG (кроме версии AutoCAD)? Если они есть.
Название: Re: сохранить в формат DXF версии 2000
Отправлено: Nipal от 04.11.23, 13:34:36
Цитата: Sabahs от 16.01.21, 12:14:54SaveDXF.png
Тут, я плохо показал, где почитать?
Название: Re: сохранить в формат DXF версии 2000
Отправлено: feron от 04.11.23, 14:32:52
Цитата: Nipal от 04.11.23, 13:34:36Тут, я плохо показал, где почитать?

не работает - что то не хватает коду видимо каких то еще параметров.

https://forum.ascon.ru/index.php?topic=38269.0
Название: Re: сохранить в формат DXF версии 2000
Отправлено: lavgirb от 04.11.23, 15:43:56
Цитата: Nipal от 04.11.23, 13:34:36Тут, я плохо показал, где почитать?
Показали хорошо.
Я просил, кроме версии AutoCAD.
Хотелось бы, чтоб вот эта галка была снята на момент конвертации.
Если она не снята, в AutoCADе шрифт КОМПАСа у меня ломается.

Тексты.JPG
Название: Re: сохранить в формат DXF версии 2000
Отправлено: lavgirb от 04.11.23, 15:50:16
Цитата: feron от 04.11.23, 14:32:52не работает - что то не хватает коду видимо каких то еще параметров.
На VB6 нормально работает. Но пришлось поэкспериментировать кое с чем )
Название: Re: сохранить в формат DXF версии 2000
Отправлено: Nipal от 04.11.23, 15:51:49
Цитата: lavgirb от 04.11.23, 15:43:56Показали хорошо.
Я просил, кроме версии AutoCAD.
Хотелось бы, чтоб вот эта галка была снята на момент конвертации.
Если она не снята, в AutoCADе шрифт КОМПАСа у меня ломается.

Тексты.JPG
Вызовете настройки перед конвертацией и снимите галку или читайте.
Agad.png
Название: Re: сохранить в формат DXF версии 2000
Отправлено: Вират Лакх от 04.11.23, 18:02:57
Проще всего прочитать все свойства интерфейса
def printprop(i): # i - интерфейс
for _ in sorted(i._prop_map_get_):
print(_, getattr(i, _))

printprop(iConverterParameters)
Название: Re: сохранить в формат DXF версии 2000
Отправлено: lavgirb от 04.11.23, 18:08:24
А, понял. Спасибо, Nipal.

Цитата: Вират Лакх от 04.11.23, 18:02:57Проще всего прочитать все свойства интерфейса
def printprop(i): # i - интерфейс
for _ in sorted(i._prop_map_get_):
print(_, getattr(i, _))

printprop(iConverterParameters)
Для меня это сложно
Название: Re: сохранить в формат DXF версии 2000
Отправлено: Вират Лакх от 04.11.23, 18:12:37
Что тут сложного. После получения интерфейса iConverterParameters = iConverter.ConverterParameters(1) вставьте приведенный код (описание функции и её вызов).
Название: Re: сохранить в формат DXF версии 2000
Отправлено: feron от 04.11.23, 23:08:27
Тут наверно надо вешать хук на К. и посмотреть как он обращается к библиотеке - скорее всего у конечной не ведется сохранение умолчательных параметров.

Traceback (most recent call last):
  File "g:\...\CDW to dwg.py", line 75, in <module>
    printprop(iConverterParameters)
  File "g:\...\CDW to dwg.py", line 22, in printprop
    for _ in sorted(i._prop_map_get_):
  File "C:\Python_3.9.7x64\Lib\site-packages\win32com\client\dynamic.py", line 576, in __getattr__
    raise AttributeError(attr)
AttributeError: _prop_map_get_
Название: Re: сохранить в формат DXF версии 2000
Отправлено: Михаил88 от 05.11.23, 10:56:41
Цитата: lavgirb от 04.11.23, 15:50:16На VB6 нормально работает. Но пришлось поэкспериментировать кое с чем )

На python тоже работает нормально.


Screenshot_1.bmp
Название: Re: сохранить в формат DXF версии 2000
Отправлено: lavgirb от 05.11.23, 12:49:11
Цитата: Михаил88 от 05.11.23, 10:56:41На python тоже работает нормально.


Screenshot_1.bmp
Если в конвертере можно системный путь не указывать к dwgdxfExp.rtw, то это удобно. Опробую.
Код удобнее читать, когда он вставлен по специальной кнопке Код"[code[]/code]"
Название: Re: сохранить в формат DXF версии 2000
Отправлено: Nipal от 05.11.23, 13:29:15
Цитата: lavgirb от 05.11.23, 12:49:11Если в конвертере можно системный путь не указывать к dwgdxfExp.rtw, то это удобно. Опробую.
Код удобнее читать, когда он вставлен по специальной кнопке Код"[code[]/code]"
По правильному он с реестра читается, тут я включил лентяя.
PS. По поводу "[code[]/code]", я люблю картинки кода, там всё правильно, перепишете в голове кое-что останется.