Поиск стандартного изделия в PartLib по Location

Автор Cyclopentan, 26.07.21, 16:59:37

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Cyclopentan

Коллеги, добрый день!
Не так давно с вашей помощью получил ID_PartLib для стандартных изделий и, что особо важно, для болтовых соединений из Моделирования Металлоконструкций. Однако радость моя была не долгой.
При подключении к PARTLibClient для вычитывания параметров больше половины ID_PartLib (формата PART:Root±140±10±10±30±30±10[Нет;Без покрытия;Стандартный;АД1 ГОСТ 4784-97;37;16]) API не может распарсить параметры.

Листинг метода получения параметров из PARTLibClient:
if (PLClient.Connect(ref errorMsg) == 0)
            {
                // Идентификатор класса, идентификатор объекта
                var classID = String.Empty;
                var objectID = String.Empty;
                // Возвращаем данные об объекте, заданном идентификатором Location
                PLClient.GetObjectInfo(ID_PartLib, ref classID, ref objectID);
                try
                {
                    BOObject boObject = PLClient.GetObject(classID, objectID, 0);
                    for (int i = 0; i < boObject.Objects.Count; i++)
                    {
                        var tempObject = boObject.Objects.Item[i];
                        Parameters = Parameters + "[(" + tempObject.ClassID + ") = {" + tempObject.Attribute["Value"].Value + "}]";
                    }
                }
                catch (Exception ex)
                {
                    log.addLog(ex.Message);
                };
            PLClient.Disconnect();
            }

При этом функция PLClient.GetObjectInfo(ID_PartLib, ref classID, ref objectID); корректно отрабатывает для всех ID_PartLib и возвращает classID и objectID.

Но при этом функция BOObject boObject = PLClient.GetObject(classID, objectID, 0);, которая, собственно, должна есть то, что ей отдаёт GetObjectInfo, в большинстве случаев выдаёт ошибку.

Пример ошибок для разных ID_PartLib:
'Ст5Гпс ГОСТ 380-2005' is not a valid floating point value
'Без указания материала' is not a valid floating point value
Неверные параметры топика


Судя по ошибкам, GetObject не нравится последовательность параметров, которые ей передаются в objectID.
Я бы поверил, что я вообще делаю что-то не так, если бы вообще все ID_PartLib оказались нерабочие, но для одного болтового соединения болт и гайка невалидные, а шайба оказалась валидная, успешно переварилась GetObject и вернула все свойства.

Отсюда вопрос - может есть какая-то хитрость, как скармливать objectID или Location в SDK PartLib?

P.S. А ни у кого нет актуальной PartLibAPI.chm? Делал всё по PartLibAPI_Complex2014sp4, возможно с тех пор что-то поменялось.

KrissKross

is not a valid floating point value
Дословный перевод
Не допустимое значение с плавающей точкой

может в этом проблема - разделитель вещественного числа

Cyclopentan

Тоже сначала грешил на это, ошибка стандартная delph-ячая.
Но в передаваемых параметрах нет чисел с плавающей запятой.

Вот пример валидного ID_PartLib для шайбы, который функция PLClient.GetObject(classID, objectID, 0) норм обработала:
PART:B94B_1AF14C31BF4E4FAE[Нет;Без покрытия;16;1;Стандартный;Ст5Гпс ГОСТ 380-2005]
Вот пример не валидного ID_PartLib для другой шайбы, на который функция ругнулась:
PART:B46A_D6DCDCBB52D14562[Нет;Без покрытия;Стандартный;Ст5Гпс ГОСТ 380-2005;16]

Оба ID_PartLib были получены одним и тем же способом.
Из примера видно, что параметры целые, но их последовательность и количество не совпадают. При этом это шайбы в 2 разных болтсетах, сделанных абсолютно одинаково.
Проверил ID_PartLib внутри MetaProductInfo - айдишники совпадают, значит компас вернул их верно.
Проверил ID_PartLib (без параметров в []) внутри VaultTAB.mdb в самом PartLib - записи с такими айдишниками есть.
Думается, что проблема именно в странном количестве и очередности возвращаемых параметров, но почему так - непонятно.

Cyclopentan

Да, не особо на это акцентировал внимание - проблема с половиной рабочих ID_PartLib и половиной нерабочих проявляется именно при использовании болтовых соединений из Моделирования Металлоконструкций, которые вставляют целиком болтсет из болта, гайки и шайбы.
Если вставлять стандартные изделия обычным образом из библиотеки СИ, то всё работает замечательно, все ID_PartLib валидные.

Вират Лакх

Цитата: Cyclopentan от 26.07.21, 16:59:37P.S. А ни у кого нет актуальной PartLibAPI.chm?
См. вложение.
В IBOSimpleProvider, кроме GetObject, есть ещё GetObject2 с таким же набором аргументов. Вдруг прокатит ::)

pr0100

Давно игрался с полиномом, современным аналогом СИ, думаю с СИ аналогично.

from win32com.client import Dispatch#
iBOSimpleProvider = Dispatch('Polynom.BOSimpleProvider') # Подключение к библиотеке Полином


#Location = iBOSimpleProvider.Select(True, '^Sortament:V0F75030229ED470091EC604F3E287D36', 0)#[1]
m='^PART:VCCE5324EDA5E4DA184BFAB6D008E26D9'
#m='PART:cce5324e-da5e-4da1-84bf-ab6d008e26d9'
Location = iBOSimpleProvider.Select(True, m, 1)#(1)

GetObjectInfo=iBOSimpleProvider.GetObjectInfo(Location,None,None)
print(GetObjectInfo)

##ClassID='PART'
##ObjectID='68143c47-2d0a-2fe9-3da8-4bab1f35d8cc'
##iBOObject = iBOSimpleProvider.GetObject(ClassID, ObjectID,0)
##print(iBOObject.XML)

Cyclopentan

Ещё раз здравствуйте, коллеги!
И спасибо за советы.

Поэкспериментировал с GetObject2 - PartLib даже валидные айдишники не захотел потреблять с такой функцией, увы. Либо чего-то я не так делал.
P.S. Спасибо за PartLibAPI!

По-поводу коннекта наподобие Полинома - в нём используются адекватные айдишники вида Sortament:V0F75030229ED470091EC604F3E287D36 с ссылкой на конкретный сортамент, материал, металлопрокат, типоразмер и т.д.
В СИ, насколько я понял, айдишник вида PART:B94B_1AF14C31BF4E4FAE[Нет;Без покрытия;16;1;Стандартный;Ст5Гпс ГОСТ 380-2005] является ссылкой на группу элементов и включает в себя параметры для уточнения элемента из этой группы. И вот проблема не в самой ссылке, а в неверном получении параметров.

Пока что решил для себя задачу крайне топорно - нашёл в СИ те метизы, которые используются в болтовых соединениях металлоконструкций, вставил их как стандартное изделие, взял из них валидный ID_PartLib и просто заменяю невалидные айдишники на валидные по таблице соответствий. В металлоконструкциях максимум 20-30 метизов, из которых можно собирать такое болтовое соединение, так что метод хоть и заставляет дёргаться глаз, но вполне рабочий.