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

Сокращённые и погашенные компоненты


hztp_serg

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

Раскрывая рекурсивно состав сборки нужно решать сокращённые компонеты, поскольку попытка получить указатель на сокращённый компонент возвращает NULL. С помощью товарищей по форуму решаю эту проблему так:

IModelDoc2 *swModelDoc=NULL;

	IConfiguration *swCfg=NULL;

	IDispatch *pDispatch;

	long Suppression, lError;

	BSTR Path;

	hres = pComponent->GetPathName(&Path);

	pComponent->GetSuppression(&Suppression);

	if ( Suppression != 2 )

	{

		pComponent->SetSuppression2(2, &lError);

	}

	hres = pComponent->GetModelDoc(&pDispatch);

	pDispatch->QueryInterface(&swModelDoc);

	pComponent->get_ReferencedConfiguration(&ConfigName);

	swModelDoc->IGetConfigurationByName(ConfigName, &swCfg);
почему-то этот кусок кода очень замедляет процес раскрытия сборки. Может можно как-то оптимизировать?

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

VARIANT_BOOL bSupp;

	pComponent->IsSuppressed(&bSupp);

	if ( bSupp = TRUE )

	{

		return 0

	}
или может можно определить погашен ли компонент по результату функции pComponent->GetSuppression(&Suppression)? Большое спасибо!
Ссылка на сообщение
Поделиться на других сайтах


...............

почему-то этот кусок кода очень замедляет процес раскрытия сборки. Может можно как-то оптимизировать?

А зачем в цикле решать каждый комонент? Все это можно сделать в начале кода на уровне верхней сборки.

long docType;

	hres = swModel->GetType(&docType);

	if(docType != swDocASSEMBLY)

	{

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

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

		return;		

	}

	

	IAssemblyDoc *swAssembly = NULL;

	hres = swModel->QueryInterface(IID_IAssemblyDoc, (void**)&swAssembly);	

		

	long countLightWeight;

	hres = swAssembly->GetLightWeightComponentCount(&countLightWeight); // определяем кол-во сокращенных компонентов

	

	if(countLightWeight > 0)

	{

		VARIANT_BOOL retval = TRUE;

		swAssembly->ResolveAllLightweight(&retval); // если они есть, то решаем их

	}
А еще можно возложить на пользователя выбор, по какому сценарию должна читаться сборка, вызвав какое нибудь диалоговое окно. Лично я, сделал так. (см. рис)

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

VARIANT_BOOL bSupp;

	pComponent->IsSuppressed(&bSupp);

	if ( bSupp = TRUE )

	{

		return 0

	}
или может можно определить погашен ли компонент по результату функции pComponent->GetSuppression(&Suppression)? Большое спасибо!
Если пользователь, решил все компоненты, смысла в вызове функции GetSuppression, я не вижу, достаточно и IsSupression. Другое дело, когда он оставил компоненты сокращенными. Ведь есть задачи, которые решаются на уровне компонента, а не на уровне модели. Например простой подсчет деталей. Там вызов функции GetModelDoc() и не нужен.

post-3876-1261152556_thumb.jpg

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

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

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

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

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

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

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

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

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

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

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




  • Сообщения

    • Kelny
      Даже при всём при этом оно не всегда корректно работало, так что даже в старых версиях было быстрее удалить размер и потом вставить заново, чем искать эти точки размеров, а потом пытаться их привязать к новому месту.   Возможно это всего лишь глюк новой версии, в последних версиях они похоже штатно закладываются.
    • maxx2000
      @davidovka я их сразу ссыпаю в TEMP,  в тех что живы нет отметок о создании current_session.pro. Интересно что сам current_session.pro создаётся, но не обновляется дата в отличии от даты модели. Может быть и вправду менял какие нить настройки и забывал сохранить
    • Ahito
    • maxx2000
      т.е. доверять разработчикам оснований нет. Ясно-понятно
    • clavr
      все так и было до 2024 версии. размеры не импортировались. теперь вот в 2024 так нельзя. может где-то в настройках поменять что нужно? все перерыл, пока не нашел
    • arsenev
      Первый свободный номер инструмента   int list $toolnumblist = extract(folder('TOOL'), 'Tool.Number.Value') int $newToolNumb = 1 while member( $toolnumblist, $newToolNumb) {     $newToolNumb = $newToolNumb + 1 } Message Info 'Первый свободный номер инструмента - ' + $newToolNumb     Инструменты с повторяющимися номерами   int list $toolnumbers = extract(folder('tool'),'Number.Value') int $i = remove_duplicates($toolnumbers) string $op = '' foreach $n in $toolnumbers {     string list $names = extract(filter(folder('tool'),'this.Number.Value == "' + $n + '"'),'Name')     if size($names) > 1 {         $op = $op + 'Инструменты с повторяющимся номером T ' + $n + CRLF         foreach $name in $names {             $op = $op + $name + CRLF         }         $op = $op + CRLF     } } message info $op     Удаление выбранного   Макрос, который проверяет тип объекта, а затем позволяет выбрать один и удалять выбранные части. Я связал это с ctrl+d.   string list $rootTypes = {'toolpath','featureset','pattern','boundary','model'} string list $selectedTypes = {} foreach $rt in $rootTypes {     if entity_exists(entity($rt,'')) {         entity $ent = entity($rt,'')         if number_selected($ent.RootType, $ent.Name) > 0 {             int $i = add_last($selectedTypes,$rt)         }     } } if size($selectedTypes) <= 0 {     return } int $index = -1 if size($selectedTypes) == 1 {     $index = 0 } else {     $index = input choice $selectedTypes 'Wich Type to remove?' } if $index != -1 {     String $cmd = 'DELETE ' + $selectedTypes[$index] + ' "' + entity($selectedTypes[$index],'').Name + '" SELECTED'         DoCommand $cmd }
    • PETR_1
      Можно переназначить правую и центральную (колесо) кнопки с помощью бесплатной программы X-Mouse Button Control (есть портабельная версия). Это переназначение будет работать только для компаса.
    • Kelny
      Может изменяемый вами размер импортирован из модели?  Обычно переносилось удержанием левой кнопки мыши, а если сделать двойной клик, то нужно потом выбрать новый объект уже без удержания кнопок мыши.
    • Kelny
      Отключить галочки режима большой сборки. Инструменты-Параметры...-Настройки пользователя-Сборки
    • brigval
      Если не прописали, значит считается, что производственный процесс их изготовления гарантирует качество, достаточное для присвоения литеры. Можно и так посмотреть.   Между прочим, пред вынесением Решения о присвоении литеры проходит "испытания" весь комплект  КД. Разрешат вам не предъявлять часть КД на проверку? Спросите у НК.   И все-таки, если есть Решение о присвоении литеры, надо прочитать, что там сказано. Как сформулировано. Возможно, это снимет все вопросы.
×
×
  • Создать...