Коллеги, добрый день!
Не так давно с вашей помощью получил 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, возможно с тех пор что-то поменялось.
is not a valid floating point value
Дословный перевод
Не допустимое значение с плавающей точкой
может в этом проблема - разделитель вещественного числа
Тоже сначала грешил на это, ошибка стандартная 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 - записи с такими айдишниками есть.
Думается, что проблема именно в странном количестве и очередности возвращаемых параметров, но почему так - непонятно.
Да, не особо на это акцентировал внимание - проблема с половиной рабочих ID_PartLib и половиной нерабочих проявляется именно при использовании болтовых соединений из Моделирования Металлоконструкций, которые вставляют целиком болтсет из болта, гайки и шайбы.
Если вставлять стандартные изделия обычным образом из библиотеки СИ, то всё работает замечательно, все ID_PartLib валидные.
Цитата: Cyclopentan от 26.07.21, 16:59:37P.S. А ни у кого нет актуальной PartLibAPI.chm?
См. вложение.
В IBOSimpleProvider, кроме GetObject, есть ещё GetObject2 с таким же набором аргументов. Вдруг прокатит ::)
Давно игрался с полиномом, современным аналогом СИ, думаю с СИ аналогично.
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)
Ещё раз здравствуйте, коллеги!
И спасибо за советы.
Поэкспериментировал с GetObject2 - PartLib даже валидные айдишники не захотел потреблять с такой функцией, увы. Либо чего-то я не так делал.
P.S. Спасибо за PartLibAPI!
По-поводу коннекта наподобие Полинома - в нём используются адекватные айдишники вида Sortament:V0F75030229ED470091EC604F3E287D36 с ссылкой на конкретный сортамент, материал, металлопрокат, типоразмер и т.д.
В СИ, насколько я понял, айдишник вида PART:B94B_1AF14C31BF4E4FAE[Нет;Без покрытия;16;1;Стандартный;Ст5Гпс ГОСТ 380-2005] является ссылкой на группу элементов и включает в себя параметры для уточнения элемента из этой группы. И вот проблема не в самой ссылке, а в неверном получении параметров.
Пока что решил для себя задачу крайне топорно - нашёл в СИ те метизы, которые используются в болтовых соединениях металлоконструкций, вставил их как стандартное изделие, взял из них валидный ID_PartLib и просто заменяю невалидные айдишники на валидные по таблице соответствий. В металлоконструкциях максимум 20-30 метизов, из которых можно собирать такое болтовое соединение, так что метод хоть и заставляет дёргаться глаз, но вполне рабочий.