Если кто знает как это написать помогите.
Я разберусь рано или поздно выложу суда готовый и подробно описанный вариант.
А пока прошу вас поделиться мнением о том как это правильно сделать, буду рад любому объяснению и помощи.
"Сохранить как" выбираете расширение dxf
Жмете на Параметры выбираете версию Автокада.
Всё.
См. вложение
Цитата: 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
Цитата: 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
Евгений Сергеевич, порадуйте нас, если не получилось, тоже, не стесняйтесь, но полный проект, можно посмотреть?
Цитата: Sabahs от 23.12.20, 21:11:56Уважаемый, Владимир Иванович, напишите ему код, он его не поймет, но напишет, что разобрался.
Пардон извиняюсь опять не свою тему влез.
как то так все выглядит я беру 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;
Уже показывал какого он типа 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;
Я вот поменял флаг, подумал что при закрытии компаса, эта настройка слетает обратно и не стал менять назад.
я не знаю почему я пробовал менять флаг на интерфейс kompas7 и не вышло а когда newkompasAPI получил с ним смог поменять флаг
ну я вник в код насколько смог я когда его собирал только начинал знакомиться с API в целом ну а сейчас к нему не возвращался так как работает, хотя наверное стоит на его примере по разбираться. а то я в каком то тупике если честно
я сгенерировал да этот модуль, получается что __MIDL___MIDL_itf_ACADExport_0000_0000_0001 тип этой переменной
Тип - TOleEnum, а имя можно и поменять.
DXF_1.png
я получается объявляю переменую Acad:TOleEnum потом приравниваю её Acad:=ksAutocad_v15
currentAcadFileVersion а эту я объявляю как ksautoсadfileversionEnum или что это вообще такое ?
Вы лучше почитайте книги по языку.
Книга в двух томах выглядит так.
https://www.for-stydents.ru/informatika/delphi/uchebniki/delphi-5-rukovodstvo-razrabotchika-tom-1-osnovnye-metody-i-tehnologii-programmirovaniya.html
спасибо большое, начал читать, надеюсь это ускорит дело, изучу за сегодня завтра
Цитата: 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.
iConverterParameters
AcadFileVersion
я не могу к этим вещам обратится может какой то библиотеки не хватает или что
Вы считаете, что тут все экстрасенсы?
Прикрепите полностью проект, тогда можно будет посмотреть, что не хватает.
проект вот таков 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.
Вы видели в каком виде примеры в SDK?
Проект, значит все файлы, чтобы его можно было открыть и скомпилировать.
Где тут iConverterParameters и AcadFileVersion?
Par:=con.ConverterParameters(1) as iConverterParameters;
Par.AcadFileVersion:=...;
Делфи подсказывает обычно когда правильно пишешь.
Я пытаюсь ввести iConverterParameters и AcadFileVersion он не знает таких
https://yadi.sk/d/hE0RYeN9br_E9Q?w=1 суда закинул проект
Яндекс диск мне не доступен? Да и архив проекта спокойно можно прикрепить к сообщению.
Цитата: EKosarev от 15.01.21, 13:59:59iConverterParameters
AcadFileVersion
я не могу к этим вещам обратится может какой то библиотеки не хватает или что
Проблема.
SaveDXF.png
Ого, огромное спасибо, на многое открыли мне глаза, особенно по приведению к классу через оператор AS
И вот это для меня крутая фишкаi:=Length(fname);
if i>3 then fSaveName:=Copy(fname,1,i-3)+'dxf';
сколько же мне еще учится
Только с этой "крутой фишкой" надо быть на стопроцентов уверенным что расширение у fname ЕСТЬ и что оно состоит из ТРЁХ символов.
А то мы имеем в семнадцатом компасе "крутой косяк" в диалоге "Сохранить как..." который СТП уже третий год исправлять не желает... и тоже наверняка в нём такой же подход без проверок...
Для этого фильтр есть, какие файлы открывать.
Filter.png
Я имел ввиду не конкретно К, а то что в программировании такой прямолинейный подход без предварительной проверки, может применяться только если Вы на стопроцентов ЗНАЕТЕ... иначе кто-нибудь обязательно Вам подложит грабли - как я уже привёл пример диалога "Сохранить как..." - при разных настройках ОС и результат разный...
Цитата: Вират Лакх от 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)? Если они есть.
Цитата: Sabahs от 16.01.21, 12:14:54SaveDXF.png
Тут, я плохо показал, где почитать?
Цитата: Nipal от 04.11.23, 13:34:36Тут, я плохо показал, где почитать?
не работает - что то не хватает коду видимо каких то еще параметров.
https://forum.ascon.ru/index.php?topic=38269.0
Цитата: Nipal от 04.11.23, 13:34:36Тут, я плохо показал, где почитать?
Показали хорошо.
Я просил, кроме версии AutoCAD.
Хотелось бы, чтоб вот эта галка была снята на момент конвертации.
Если она не снята, в AutoCADе шрифт КОМПАСа у меня ломается.
Тексты.JPG
Цитата: feron от 04.11.23, 14:32:52не работает - что то не хватает коду видимо каких то еще параметров.
На VB6 нормально работает. Но пришлось поэкспериментировать кое с чем )
Цитата: lavgirb от 04.11.23, 15:43:56Показали хорошо.
Я просил, кроме версии AutoCAD.
Хотелось бы, чтоб вот эта галка была снята на момент конвертации.
Если она не снята, в AutoCADе шрифт КОМПАСа у меня ломается.
Тексты.JPG
Вызовете настройки перед конвертацией и снимите галку или читайте.
Agad.png
Проще всего прочитать все свойства интерфейса
def printprop(i): # i - интерфейс
for _ in sorted(i._prop_map_get_):
print(_, getattr(i, _))
printprop(iConverterParameters)
А, понял. Спасибо,
Nipal.
Цитата: Вират Лакх от 04.11.23, 18:02:57Проще всего прочитать все свойства интерфейса
def printprop(i): # i - интерфейс
for _ in sorted(i._prop_map_get_):
print(_, getattr(i, _))
printprop(iConverterParameters)
Для меня это сложно
Что тут сложного. После получения интерфейса iConverterParameters = iConverter.ConverterParameters(1) вставьте приведенный код (описание функции и её вызов).
Тут наверно надо вешать хук на К. и посмотреть как он обращается к библиотеке - скорее всего у конечной не ведется сохранение умолчательных параметров.
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_
Цитата: lavgirb от 04.11.23, 15:50:16На VB6 нормально работает. Но пришлось поэкспериментировать кое с чем )
На python тоже работает нормально.
Screenshot_1.bmp
Цитата: Михаил88 от 05.11.23, 10:56:41На python тоже работает нормально.
Screenshot_1.bmp
Если в конвертере можно системный путь не указывать к dwgdxfExp.rtw, то это удобно. Опробую.
Код удобнее читать, когда он вставлен по специальной кнопке
Код"[code[]/code]"
Цитата: lavgirb от 05.11.23, 12:49:11Если в конвертере можно системный путь не указывать к dwgdxfExp.rtw, то это удобно. Опробую.
Код удобнее читать, когда он вставлен по специальной кнопке Код"[code[]/code]"
По правильному он с реестра читается, тут я включил лентяя.
PS. По поводу "[code[]/code]", я люблю картинки кода, там всё правильно, перепишете в голове кое-что останется.