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

Разработка приложения под Solidworks на языке C++


reaper

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

Такой вопрос : как присвоить значение указателю чтобы он не выдавал нулевое значение перед тем как задать материал детали ?

hres = swApp->IActivateDoc3(L"Деталь0", VARIANT_TRUE, &lErrors, &swModel); // активируем документ сборки

hres = swPart->SetMaterialPropertyName2(L"Default",database,L"Простая углеродистая сталь");

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


Такой вопрос : как присвоить значение указателю чтобы он не выдавал нулевое значение перед тем как задать материал детали ?

hres = swApp->IActivateDoc3(L"Деталь0", VARIANT_TRUE, &lErrors, &swModel); // активируем документ сборки

hres = swPart->SetMaterialPropertyName2(L"Default",database,L"Простая углеродистая сталь");

Примерно так:

long docType;

	hres = swModel->GetType(&docType);

	if(docType != swDocPART)

	{

		strMessage = L"Функция работает только с документом детали!";

		swApp->SendMsgToUser2(strMessage, swMbInformation, swMbOk, &lResult);

		::CoUninitialize();

		return 0;

	}



	CComBSTR strDataBase = L"solidworks materials.sldmat";

	CComBSTR strConfig = L"Default";

	CComBSTR strMaterial = L"1023 Carbon Steel Sheet (SS)";

	IPartDoc *swPart = NULL;

	hres = swModel->QueryInterface(IID_IPartDoc, (void**)&swPart);

	hres = swPart->SetMaterialPropertyName2(strConfig, strDataBase, strMaterial);

	

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

Написал следующим образом - не работает. Может быть я неправильно strMaterial прописываю ?

CComBSTR strDataBase = L"C:\\Program Files\\SolidWorks\\lang\\russian\\sldmaterials\\solidworks materials.sldmat";

CComBSTR strConfig = L"Default";

CComBSTR strMaterial = L"Легированная сталь";

IPartDoc *swPart = NULL;

hres = swModel->QueryInterface(IID_IPartDoc, (void**)&swPart);

hres = swPart->SetMaterialPropertyName2(strConfig, strDataBase, strMaterial);

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

Написал следующим образом - не работает. Может быть я неправильно strMaterial прописываю ?

CComBSTR strDataBase = L"C:\\Program Files\\SolidWorks\\lang\\russian\\sldmaterials\\solidworks materials.sldmat";

CComBSTR strConfig = L"Default";

CComBSTR strMaterial = L"Легированная сталь";

IPartDoc *swPart = NULL;

hres = swModel->QueryInterface(IID_IPartDoc, (void**)&swPart);

hres = swPart->SetMaterialPropertyName2(strConfig, strDataBase, strMaterial);

Вообще-то все добавляется. Ищите ошибку в значения строковых переменых пути и материала.
Ссылка на сообщение
Поделиться на других сайтах

Оказалось всё просто. Для того чтобы заработало пришлось переставить SolidWorks - поставить 2009. В 2008 ничего не работало

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

Как мне задать материал в нескольких деталях подряд ?

Задаю материал в первой детали

hres = swApp->IActivateDoc3(L"Деталь0", VARIANT_TRUE, &lErrors, &swModel); //

CComBSTR strDataBase = L"C:/PROGRA~1/SOLIDW~1/lang/russian/sldmaterials/solidworks materials.sldmat";

CComBSTR strConfig = L"По умолчанию";

CComBSTR strMaterial = L"Легированная сталь";

IPartDoc *swPart = NULL;

hres = swModel->QueryInterface(IID_IPartDoc, (void**)&swPart);

hres = swPart->SetMaterialPropertyName2(strConfig , strDataBase, strMaterial);

Пытаюсь открыть вторую :

hres = swApp->IActivateDoc3(L"Деталь1", VARIANT_TRUE, &lErrors, &swModel); // ничего не выходит опять попадаю на "Деталь0"

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

Как мне задать материал в нескольких деталях подряд ?

Задаю материал в первой детали

hres = swApp->IActivateDoc3(L"Деталь0", VARIANT_TRUE, &lErrors, &swModel); //

CComBSTR strDataBase = L"C:/PROGRA~1/SOLIDW~1/lang/russian/sldmaterials/solidworks materials.sldmat";

CComBSTR strConfig = L"По умолчанию";

CComBSTR strMaterial = L"Легированная сталь";

IPartDoc *swPart = NULL;

hres = swModel->QueryInterface(IID_IPartDoc, (void**)&swPart);

hres = swPart->SetMaterialPropertyName2(strConfig , strDataBase, strMaterial);

Пытаюсь открыть вторую :

hres = swApp->IActivateDoc3(L"Деталь1", VARIANT_TRUE, &lErrors, &swModel); // ничего не выходит опять попадаю на "Деталь0"

Не видно где Вы открываете вторую деталь? Как кстати и первую. Вы только ее "активируете"!

Перед этим она должна быть открыта:

"

//Open the component (part) document 1-я деталь

CComBSTR sCompName(L"c:\\Program Files\\SolidWorks\\samples\\tutorial\\toolbox\\Part1.sldprt");

swApp->OpenDoc6(sCompName, swDocPART, swOpenDocOptions_Silent, sDefaultConfiguration, &lErrors, &lWarnings, &tmpObj);

hres = swApp->IActivateDoc3(L"Деталь1", VARIANT_TRUE, &lErrors, &swModel); // ничего не выходит опять попадаю на "Деталь0"

//Activate the part document

swApp->IActivateDoc3(sCompName, true, &lErrors, &swModel);

...

присвоение материала...

...

2-я деталь:

CComBSTR sCompName(L"c:\\Program Files\\SolidWorks\\samples\\tutorial\\toolbox\\Part2.sldprt");

swApp->OpenDoc6(sCompName, swDocPART, swOpenDocOptions_Silent, sDefaultConfiguration, &lErrors, &lWarnings, &tmpObj);

//Activate the part document

swApp->IActivateDoc3(sCompName, true, &lErrors, &swModel);

...

присвоение материала...

...

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

Деталь уже открыта была ранее. Только всё равно результат тот же

Ну Вы же написали:

"

Пытаюсь открыть вторую :

hres = swApp->IActivateDoc3(L"Деталь1", VARIANT_TRUE, &lErrors, &swModel); // ничего не выходит опять попадаю на "Деталь0"

"

И как понять фразу: "опять попадаю на "Деталь0" ?

Откуда попадаете?

Откройте явно(ручками) две детали, расположите их окна рядом и попробуйте активировать их поочередно в режиме отладки.

Какое значение имеет `hres` ?

Может после активирования документа детали требуется что-то типа такого:

"

' Grab the currently active document

Set Model = swApp.ActiveDoc

"

Это из VB.

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

Проблема решилась просто: оказалось что нужно было обнулить swModel и swPart

hres = swApp->IActivateDoc3(L"Деталь0", VARIANT_TRUE, &lErrors, &swModel);

hres = swModel->QueryInterface(IID_IPartDoc, (void**)&swPart);

hres = swPart->SetMaterialPropertyName2(strConfig , strDataBase, strMaterial);

swModel = NULL;

swPart = NULL;

hres = swApp->IActivateDoc3(L"Деталь1", VARIANT_TRUE, &lErrors, &swModel);

hres = swModel->QueryInterface(IID_IPartDoc, (void**)&swPart);

hres = swPart->SetMaterialPropertyName2(strConfig , strDataBase,L"Медь");

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

В программе организовано считывание данных с текстового файла :

char file_name[] = "C:\\korpus6.geo";

FILE* f = NULL; // файловая переменная

f = fopen(file_name, "r"); // открытие файла на чтение

.....

while( fgets(s1, 50, f) != NULL ) // s - это уже адрес

{

....

...

}

fclose(f);

Потом я ещё раз начинаю считывать данные с другого текстового файла

char file_name1[] = "C:\\78.geo";

f1 = fopen(file_name1, "r");

while( fgets(s1, 50, f1) != NULL ) // s - это уже адрес

{......

}

Вылетает сообщение "An unhandled exception of type 'System.AccessViolationException' occurred in материал.exe

Additional information: Attempted to read or write protected memory. This is often an indication that other memory is corrupt."

В файле altcomcli.h

указывает на строку CComBSTR& operator=(__in const CComBSTR& src)

{

if (m_str != src.m_str)

{

::SysFreeString(m_str);

m_str = src.Copy();

if (!!src && !*this)

{

AtlThrow(E_OUTOFMEMORY);

}

}

return *this;

}

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

Здравствуйте, подскажите, пожалуйста, как построить сплайн по контрольным точкам и knot. Окружность и линию строит, а сплайн не строит двумя методами. 

#include <atlbase.h>

#import "..\SolidworksApiFiles\sldworks.tlb" raw_interfaces_only, raw_native_types, no_namespace, named_guids  // SOLIDWORKS type library

#import "..\SolidworksApiFiles\swconst.tlb" raw_interfaces_only, raw_native_types, no_namespace, named_guids   // SOLIDWORKS constants type library

double dValue;

long iLower, iUpper;




int main()
{
	// Initialize COM
	// Do this before using ATL smart pointers so COM is available.
	CoInitialize(NULL);

	// Use a block, so the smart pointers are destructed when the scope of this block is left
	{
		// COM Pointer of Soldiworks object
		CComPtr<ISldWorks> swApp;

		// COM Pointer of Soldiworks Model Document
		CComPtr<IModelDoc2> swDoc;

		// Variable to check if function is 
		HRESULT result = NOERROR;

		// COM Style String for message to user
		CComBSTR _messageToUser;

		// long type variable to store the result value by user
		long _lMessageResult;

		// Create an instance of Solidworks application
		// If it fails then return 0 and close program
		if (swApp.CoCreateInstance(__uuidof(SldWorks), NULL, CLSCTX_LOCAL_SERVER) != S_OK)
		{
			// Stop COM 
			CoUninitialize();
			return(0);
		}

		// COM Style String to store document type
		CComBSTR _documentType;

		// Get the Default Part document
		swApp->GetUserPreferenceStringValue(swUserPreferenceStringValue_e::swDefaultTemplatePart, &_documentType);

		// Create a new Part Document 
		result = swApp->INewDocument2(_documentType, 0, 0, 0, &swDoc);

		// If there are no Default Part document assign then show a message to user
		// and Stop COM, Visible the Solidworks and return the function
		if (result != S_OK)
		{
			// COM Style String for message to user
			_messageToUser = (L"Failed to open document.\nPlease try again.");

			// Send a message to user and store the return value in _lMessageResult by referencing it
			swApp->SendMsgToUser2(_messageToUser, swMessageBoxIcon_e::swMbInformation, swMessageBoxBtn_e::swMbOk, &_lMessageResult);


			// Visible the Solidworks
			swApp->put_Visible(VARIANT_TRUE);

			// Stop COM 
			CoUninitialize();
			return(0);
		}


		IModelDoc2 *swModel;

		HRESULT hres = swApp->get_IActiveDoc2(&swModel);

		if (swModel == NULL)

		return 1;

		ISketchManager *swSketchMgr;

		hres = swModel->get_SketchManager(&swSketchMgr);

		double Ctrl[18];

		Ctrl[0] = 0.0;
		Ctrl[1] = 0.0;
		Ctrl[2] = 0.0;

		Ctrl[3] = 0.1;
		Ctrl[4] = 0.05;
		Ctrl[5] = 0.0;

		Ctrl[6] = 0.2;
		Ctrl[7] = 0.2;
		Ctrl[8] = 0.0;

		Ctrl[9] = 0.3;
		Ctrl[10] = 0.25;
		Ctrl[11] = 0.0;

		Ctrl[12] = 0.4;
		Ctrl[13] = 1.25;
		Ctrl[14] = 0.0;

		Ctrl[15] = 0.5;
		Ctrl[16] = 4.25;
		Ctrl[17] = 0.0;

		long Props[4];
		Props[0] = 3;
		Props[1] = 6;
		Props[2] = 6;
		Props[3] = 0;

		double Knot[12];
		
		Knot[0] = 0.0;
		Knot[1] = 0.0;
		Knot[2] = 0.0;
		Knot[3] = 0.0;
		Knot[4] = 0.0;
		Knot[5] = 0.0;
		Knot[6] = 1.0;
		Knot[7] = 1.0;
		Knot[8] = 1.0;
		Knot[9] = 1.0;
		Knot[10] = 1.0;
		Knot[11] = 1.0;
		
		ISketchSegment *swSketchSegment;

		hres = swSketchMgr->CreateCircleByRadius(0.15, 0.05, 0.0, 0.01, &swSketchSegment);  //OK
		hres = swSketchMgr->CreateLine(0.0, 0.0, 0.0, 0.0, 0.05, 0.0, &swSketchSegment);  //OK
		hres = swSketchMgr->ICreateSplineByEqnParams(Props, 12, Knot,6, Ctrl, &swSketchSegment);//false

		IModeler *Modeler;
		hres = swApp->IGetModeler(&Modeler);
		ICurve *curve;
		hres = Modeler->ICreateBsplineCurve(Props, Knot, Ctrl, &curve);//false

		// If created successfully, then visible the Solidworks
		swApp->put_Visible(VARIANT_TRUE);
	}

	// Stop COM 
	CoUninitialize();


}

 

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

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

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

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

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

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

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

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

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

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

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




  • Сообщения

    • Jesse
      Также по формуле Струхаля  хотел оценить насколько частота срыва вихрей с лопастей рабочего колеса находится близко к собственной частоте вала. Т.е. что-то вроде того   Вопрос в характерной длине. Вот в этих лекциях говорится, что надо брать что-то вроде длины дуги между лопастями. Т.е. это и будет получается наша характерная длина (k - число лопастей).   Т.е. в моём случае выделенный зеленым участок.   Вроде похоже на картинки из cfd те что выше кинул. Но всё же: никому не попадался источник по правильному выбору характерной размера/гидравлического диаметра? Обосновать хочитца!   p.s.: и тут блин тоже частота срыва вихрей близко получается к СЧ..)) Струхаль брал равным 0,2
    • gjkol
      Уважаемый, а что означает это НД/ВД или g75 Peck Grooving Cycle O.D. or I.D.   просто по моему опыту, когда знаешь расшифровку все становится понятее.  Заранее благодарен
    • mml35
      Я в любом случае благодарен, за потраченное на меня время.) Буду искать ошибки в уравнениях регионов.
    • Ветерок
      Я не знаком с вашими настройками, поэтому не могу сказать. У меня не так. А разбираться в ваших настройках нет никакого желания, уж извините.   Если деталь есть в разделе спецификации, а номер позиции не отображается, это странно. Надо разбираться с настройками спецификации. Может, там ещё какие условия прописаны.
    • mml35
      Про раздел спецификации понятно то, что в при создании файла (в каталоге Camozzi нет этого раздела и его нужно заполнить самостоятельно). Но на основании чего Creo вносит в параметры модели при создании например детали - вносит параметр  РАЗДЕЛ_СПЕЦИФИКАЦИИ - Детали. Потом я создаю так же резиновое кольцо и Creo в РАЗДЕЛ_СПЕЦИФИКАЦИИ - Стандартные детали? На основании чего она так решает. Может потому что нет обозначения-поставил все равно стандартное изделие. Может потому что нет чертежа - создал. Все равно стандартное изделие. Понятно, что можно в ручную изменить, но вопрос каков алгоритм, признак что Creo делает такую разноску?   И я так и не понял, почему в спецификации на этот импортированный штуцер нет номера ПОЗ (запрос rpt.index - стоит), хотя на чертеже позиция ставится? Где искать проблему?     
    • Ветерок
      На сайте производителя смотрели? Или вам нужны чертежи для серийного производства? Тогда точно к производителю :)
    • Ветерок
      Не важно как получена деталь. Номер позиции проставляется автоматически. А вот чтобы деталь попала в соответствующий раздел спецификации, у неё должен быть задан соответствующим образом параметр, который отвечает за раздел спецификации. Этот параметр может называться по-разному в зависимости от того, какими настройками пользуетесь. Например, этот параметр может называться TIP. На картинке в ответе выше этот параметр называется ТИП. Если на вашей картинке это РАЗДЕЛ_СПЕЦИФИКАЦИИ, то там нужно указать нужное значение. Это значение тоже может быть разным. К сожалению, в Крео нет единого стандарта. Каждый дилер (почти каждый) предлагал свои варианты, кроме того, на отдельных предприятиях могли быть совсем свои настройки.   В принципе, как фильтруются модели можно посмотреть в фильтрах соответствующего раздела таблицы спецификации.
    • butlug
      Точно не помню какой именно из параметров - но это параметры на созданный мной подшипник скольжения. В графе позиция у меня стоит запрос &rpt.index Спасибо за ответ. Но чаще всего есть только step и искать исходник сделанный в неизвестной программе через третьи руки перекупов по времени такое себе занятие на несколько дней... - проще уже самому расставить если их не сотни), а если это может сделать машина причем сгруппировав по диаметрам и глубинам - зачем людей по чем зря беспокоить непонятными вопросами)
    • david1920
      В личку смотрите
    • anton7
×
×
  • Создать...