Перейти к публикации

Вопросы По Программирования Под Солид


Рекомендованные сообщения

ПРивет! Давно тут не был.

Простые вопросы у меня.

Пишу прогу(exe), а не привычные адиннсы как dll

в это программе пытаюсь загрузить файл используя функию OpenDoc6(). Файл не загружается в Солиде.

Функция фозврашает значени (Оут оф мемори)

Как нить можно загрузить файл?

А задача стоит такая:

1) Солид вообще не запускать или запускать так, чтобы пользователь его не видел, тоже самое касается и файла

2) неоходимо получить список всех компонентов сборки, чтобы узнать где они лежат

(один вариант я знаю, но для этого необходимо загрузить файл сборки в солид)

Кто нить что-нить посоветует?

Ссылка на сообщение
Поделиться на других сайтах


в это программе пытаюсь загрузить файл используя функию OpenDoc6(). Файл не загружается в Солиде.

Функция фозврашает значени (Оут оф мемори)

Как нить можно загрузить файл?

Да вроде ни какой разницы в вызове быть не должно, интерфейс всё таки один используется.

Вроде вот так:

Dim swApp As Object

Dim Part As Object

Dim longstatus As Long, longwarnings As Long

Sub main()

Set swApp = Application.SldWorks

Set Part = swApp.OpenDoc6("C:\Part.SLDPRT", 1, 0, "", longstatus, longwarnings)

		If Not longwarnings = 0 Then

			swApp.ActivateDoc ("Part.SLDPRT") 'активирует документ, если он уже открыт

		End If

End Sub

или запускать так, чтобы пользователь его не видел, тоже самое касается и файла

Из справки SW2007 предлагаются следующие варианты открытия Solidworks:
SolidWorks Visible or Background Example (VB)

These examples shows several situations for running or attaching to SolidWorks session through the API.



SolidWorks not running: Launch invisibly and end SolidWorks session

Sub Macro1()



Dim swApp As Object



Dim Part As Object



Set swApp = CreateObject("SldWorks.Application")



Set swApp = Nothing



' Close the SolidWorks application. If you do not perform this step, SolidWorks

' continues to run. If SolidWorks is running in the background,the user is

' unaware that SolidWorks is running and consuming their system resources.



swApp.ExitApp



End Sub







SolidWorks running: Attach to existing SolidWorks session and end SolidWorks session

Sub Macro2()



Dim swApp As Object



Dim Part As Object



Set swApp = CreateObject("SldWorks.Application")



Set swApp = Nothing



swApp.ExitApp



End Sub







SolidWorks not running: Launch invisibly, become visible, and end SolidWorks session

Sub Macro3()



Dim swApp As Object



Dim Part As Object



Set swApp = CreateObject("SldWorks.Application")



swApp.Visible = True



Set swApp = Nothing



swApp.ExitApp



End Sub







SolidWorks not running: Launch invisibly, become visible, and leave SolidWorks running

Sub Macro4()



Dim swApp As Object



Dim Part As Object



Set swApp = CreateObject("SldWorks.Application")



swApp.Visible = True



swApp.UserControl = True



' Give control to the user which will leave SolidWorks running



Set swApp = Nothing



End Sub







SolidWorks not running: Launch invisibly, create part invisibly, close part, and end SolidWorks session

Sub Macro5()



Dim swApp As Object



Dim Part As Object



' This must be explicitly defined for ActivateDoc2



Dim errors As Long 







Set swApp = CreateObject("SldWorks.Application")



Set Part = swApp.NewPart



Set Part = swApp.ActivateDoc2("Part1",True,errors)



Set Part = Nothing



swApp.CloseDoc "Part1"



Set swApp = Nothing



swApp.ExitApp



End Sub







SolidWorks not running: Launch invisibly, create part invisibly, make the part and SolidWorks visible, and leave SolidWorks running

Sub Macro6()



Dim swApp As Object



Dim Part As Object







Set swApp = CreateObject("SldWorks.Application")



Set Part = swApp.NewPart



Set Part = swApp.ActivateDoc("Part1")



Part.Visible = True 



' Make the part and SolidWorks visible



swApp.UserControl = True 



' Give control to the user which will leave SolidWorks running



Set Part = Nothing



swApp.CloseDoc "Part1"



Set swApp = Nothing



End Sub
Ссылка на сообщение
Поделиться на других сайтах

Можно, свои 5-ть копеек, (хоть я и не программист)?

Насколько я понимаю, файлы солида, хранятся в упакованном виде, причем ссылки на компоненты сборки могут быть недоступны.

Короче, царапнул я этот вопрос, и все, что мне стало ясно, это

— для того, чтобы полноценно работать с файлами Солида (без самого Солида, т.е. без его загрузки, или даже без его установки в систему), нужно иметь четкое представление о том, в каком виде представлен файл при загрузке в Солид.

Чтобы получить это представление, нужно сделать так называемый дамп памяти в момент работы Солида с одним из файлов.

После этого изучаешь структуру и вперед.

Но это уже элементы явного и жесткого хака (т.к. формат файла скорее всего защищен лицензией).

Я так подозреваю, что с этим столкнулся тот чел, который писал прогу для конвертации файлов между версиями Солида, поэтому его проект развивается "очень медленно".

Ссылка на сообщение
Поделиться на других сайтах

Я так подозреваю, что с этим столкнулся тот чел, который писал прогу для конвертации файлов между версиями Солида, поэтому его проект развивается "очень медленно".

Да тот проект, если я правильно тебя понимаю, был не конвертером версий. Он скорее, по описанию, предполагал построение в новой версии с записью макроса и потом воспроизведение этого макроса в предыдущей версии, да вот есть у этого метода куча минусов: обычно несовместимость функций или новые функции, разные методы построения, солид не всё пишет в макрос много чего пропускает. Короче этот метод по изначально провальный, им можно кубики и простые фигуры передовать, но не сложную геомерию.

Да и писалось всё на одном дыхании автором похоже была богатая идея не подкрепленная теорией и практикой...

Помнится копался в API наткнулся на такую вот функцию:

Retval = ModelDocExtension.SaveAs ( Name, Version, Options, ExportData, Errors, Warnings)
Так есть в API такое вот значение для переменной Version: swSaveAsSW98plus=1, да вот только говорят оффициальные источники, что она ни когда не работала...

для того, чтобы полноценно работать с файлами Солида (без самого Солида, т.е. без его загрузки

Без открытия солида для некоторых операций (изменение свойств файла, просмотр ссылок), на сколько я понял, можно воспользоваться SwDocumentMgr да вот только этот компонент требует ключика от Solidworks (для SW2007, в ранних версиях на неё не натыкался).
Ссылка на сообщение
Поделиться на других сайтах

я делаю так

CoInitialize(NULL);



HRESULT hres = pSwApp.CoCreateInstance(__uuidof(SldWorks), NULL, CLSCTX_LOCAL_SERVER); 



hres = pSwApp->put_UserControl(TRUE);

	

long Errors = 0, Warnings = 0;



hres = pSwApp->OpenDoc6(PathFile, swDocASSEMBLY, swOpenDocOptions_Silent, L"", &Errors, &Warnings, &pModelDoc);

ASSERT(pModelDoc != NULL);

Солид запускается, но файл не загружатеся, так как pModelDoc == NULL

Почему понять не могу.

Мне нужно получить pModelDoc.

Ссылка на сообщение
Поделиться на других сайтах

hres = pSwApp->OpenDoc6(PathFile, swDocASSEMBLY, swOpenDocOptions_Silent, L"", &Errors, &Warnings, &pModelDoc);

ASSERT(pModelDoc != NULL);

Может я чего то не понимаю, но что это за буковка перед кавычками (в помеченом красным)?

Const swOpenDocOptions_Silent=1

А ещё при записи макроса, параметр "options" не имеет ни каких значений соотвествующих контстантам и равен нулю.

Хотя есть ещё одна загвоздка: Уже проскакивали случаи, что Syntax (COM) не всё работает как надо, но при этом в VB всё путем и ни каких проблем не наблюдается.

Можнопопробовать что-нибудь постарее:

status = SldWorks->IOpenDoc ( Name, Type, &retval )



Input:

 (BSTR) Name

 Name of document or full path, if not current directory

 

Input:

 (long) Type

 Type of document as defined in swDocumentTypes_e

 

Output:

 (LPMODELDOC) retval

 Pointer to the document or NULL if the operation fails

 

Return:

 (HRESULT) status

 S_OK if successful

 



status = SldWorks->IOpenDoc3 ( filename, type, readOnly, viewOnly, RapidDraft, silent, &errors, &retval)



Input:

 (BSTR) filename

 Document name or full path, if not in current directory, including extension

 

Input:

 (long) type

 Document type as defined in swDocumentTypes_e 

 

Input:

 (VARIANT_BOOL) readOnly

 TRUE to open read only, FALSE otherwise

 

Input:

 (VARIANT_BOOL) viewOnly

 TRUE to open view only, FALSE otherwise

 

Input:

 (VARIANT_BOOL) RapidDraft

 TRUE to convert a Drawing to a RapidDraft drawing, FALSE otherwise; only valid for drawings

 

Input:

 (VARIANT_BOOL) silent

 TRUE to open silently, FALSE otherwise

 

Input:

 (long) errors

 Load errors as defined in swFileLoadError_e 

 

Output:

 (LPMODELDOC) retval

 Pointer to the newly loaded ModelDoc or NULL if fails to open

 

Return:

 (HRESULT) retval

 S_OK if successful

 



status = SldWorks->IOpenDoc4 ( filename, type, options, configuration, &errors, &retval )



Input:

 (BSTR) filename

 Document name or full path, if not in current directory, including extension

 

Input:

 (long) type

 Document type as defined in swDocumentTypes_e 

 

Input:

 (long) options

 Various BOOLEAN values affecting how a document is opened

 

Input:

 (BSTR) configuration

 Model configuration to open this document in

 

Output:

 (long) errors

 Load errors as defined in swFileLoadError_e 

 

Output:

 (LPMODELDOC) retval

 Pointer to the newly loaded ModelDoc or NULL if failed to open

 

Return:

 (HRESULT) status

 S_OK if successful
Ссылка на сообщение
Поделиться на других сайтах

Может я чего то не понимаю, но что это за буковка перед кавычками (в помеченом красным)?

Это чтобы стока "ываыв" принималась как тип BSTR, а не char.

я пробывал функция IOpenDoc5, но там получал ошибку - swFileNotFoundError хотя путь был задан верно

Хотя есть ещё одна загвоздка: Уже проскакивали случаи, что Syntax (COM) не всё работает как надо, но при этом в VB всё путем и ни каких проблем не наблюдается.

Согласен с этим, сам встречал такое.
Ссылка на сообщение
Поделиться на других сайтах

Вообще-то функция OpenDoc6 нормально работает.

void CTEM2Dlg::OnButton1() 

{

	CoInitialize(NULL);

	CLSID clsid;

	

	::CLSIDFromProgID(L"SldWorks.Application", &clsid);		 

	ISldWorks *swApp = NULL;

	

	::CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, __uuidof(ISldWorks), (void**)&swApp);

	

	long lError, lWarning;

	

	BSTR strFileName = SysAllocString(L"D:\\SolidWorks\\Rings_GOST.SLDPRT"); 

	BSTR strConfig = SysAllocString(L"Default");

	

	IModelDoc2 *swModel;

	HRESULT hres = swApp->OpenDoc6(strFileName, swDocPART, swOpenDocOptions_Silent, strConfig, &lError, &lWarning, &swModel);

	

	swModel = NULL;

	swApp = NULL;

	CoUninitialize();	

}
По всей видимости у Вас ошибка в имени файла. У меня потребовался двойной слэш.

P.S. Код работает и в VC++6.0, и в VS2005.

Ссылка на сообщение
Поделиться на других сайтах

Случайно нашел может подойдет

The SolidWorks Document Manager API:

Allows you to write applications that emulate file management tools to perform such tasks as renaming, replacing, and copying SolidWorks documents.

Is an independent software component that provides read-write functionality for SolidWorks documents. It includes interfaces for the document and configurations. These interfaces have read-only and read-write properties and methods.

This SolidWorks Document Manager API is COM-compliant and supports automation-compliant data types only. It allows you to develop your application without reading or writing binary data directly to the header portion of SolidWorks files. In fact, it is not necessary to have the SolidWorks software installed on your system to use this API.

CAUTION: The SolidWorks Document Manager API is a powerful programming tool that, if used incorrectly, could corrupt your data. Only experienced API programmers knowledgeable about SolidWorks document references should use the SolidWorks Document Manager API. It is recommended that you create backup copies of files accessed by your application before running the application.

файл

...api/swdocmgrapi.chm

Ссылка на сообщение
Поделиться на других сайтах

файл

...api/swdocmgrapi.chm

можно воспользоваться SwDocumentMgr да вот только этот компонент требует ключика от Solidworks

Ссылка на сообщение
Поделиться на других сайтах

Возможно не проверял

хотя в справке об этом не слова

If you did not install the SolidWorks software on the system where you want to use this API, you can manually register SwDocumentMgr.dll.

Both Implode.dll and zlib.dll must either reside in the same folder or be accessible via the Windows search path.

но для создания мини ПДМ

с дополнительной установкой лицензии св

вполне может даже и ни чего

Ссылка на сообщение
Поделиться на других сайтах

Возможно не проверял

Ну если четно я тоже, в справке SW2007 дополнили пункт, возможно раньше это было доступно и без ключей:

This SolidWorks Document Manager API is COM-compliant and supports automation-compliant data types only. It allows you to develop your application without reading or writing binary data directly to the header portion of SolidWorks files. In fact, it is not necessary to have the SolidWorks software installed on your system to use this API. It is, however, necessary to obtain a license key for the SolidWorks Document Manager API.

Настораживает предупреждение о возможной порчи файла:

CAUTION: The SolidWorks Document Manager API is a powerful programming tool that, if used incorrectly, could corrupt your data. Only experienced API programmers knowledgeable about SolidWorks document references should use the SolidWorks Document Manager API. It is recommended that you create backup copies of files accessed by your application before running the application.

Данный компонент похоже влезает, в святую святых, формат файла на уровне файла, а не на уровне открытого документа (с одной стороны классно, с другой можно завалить проект в случае ошибки приложения и поправить будет уже нельязя, на сколько я понимаю именно поэтому введена лицензия, потому как в лицензии написано что Solidworks не отвечает за возможные неприятности возникшие в результате использования данного компонента). Если интересно вот можно почитать текст лицензии: Royalty_Free_and_re_distributable.doc
Ссылка на сообщение
Поделиться на других сайтах

Может еще раз меня просветите?

Почему проекте (exe) вот так работает

VARIANT var;

pAssemblyDoc->GetComponents(true, &var);
А вот так

pAssemblyDoc->IGetComponents( true, nComp, (IComponent2**)pComp);
не корректно работает (получаю только первый компонент)

Для проекта в dll это

pAssemblyDoc->IGetComponents( true, nComp, (IComponent2**)pComp);
работает корректно
Ссылка на сообщение
Поделиться на других сайтах

Особо не разбирался, но по моему то же самое, что и с Component2::IGetChildren

цитата из help-a API SW

Because Component2::IGetChildren returns an array, this code must be used in an in-process DLL. Otherwise, use the method Component2::GetChildren, which returns a VARIANT.

Ссылка на сообщение
Поделиться на других сайтах

Это опять я. :)

Теперь вопрос такой как определить есть ли файл чертежа для конкретного файла детали?

Я не понимаю как Сам солид определяет, что чертеж уже есть для данной детали

Ссылка на сообщение
Поделиться на других сайтах

Я не понимаю как Сам солид определяет, что чертеж уже есть для данной детали

Есть в солиде такая кнопочка "открыть чертеж", так вот эта кнопочка поменяет расширение файла детали или сборки расширением чертежа и проверяет есть ли такой файл, если нет то предлагает его создать. Я для открытия чертежей с именами отличными от имени детали/сборки (однако имеющими, что-то общее), написал макрос: <noindex>http://fsapr2000.ru/index.php?s=&show...st&p=157935</noindex>

Так же можно найти все документы чертежей лежащие в папке с документом (или по другим критериям), и соответсвенно для каждого файла выяснить нет ли ссылки на открытый документ. Данный метод как раз и используется в SWExplorer2007, правда как то коряво, на сколько я понял он ищет документы чертежей только в папке основной сборки, а по другим путям чертежей не ищет.

Ссылка на сообщение
Поделиться на других сайтах

Все это конечно хорошо, но если файл чертежа имеет тоже имя, но не лежит там же, где и деталь, то поиск может оказаться очень длиннным :)

Вообщем что нить придумаем

Ссылка на сообщение
Поделиться на других сайтах

Все это конечно хорошо, но если файл чертежа имеет тоже имя, но не лежит там же, где и деталь, то поиск может оказаться очень длиннным :)

Не, ну это уже философия, с таким же успехом можно в компьютере искать бумажный чертеж нарисованный от руки.
Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.
Примечание: вашему сообщению потребуется утверждение модератора, прежде чем оно станет доступным.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.



×
×
  • Создать...