Очередной семинар...

Автор p3452, 30.08.21, 10:02:48

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

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

Вират Лакх

Цитата: IgorT от 30.08.21, 20:38:45Скока таим времени будет вебинар идти? Успеют?
Не время важно, а эффект. Если целью является научить, то блок основ надо дать. Эдакий экскурс в историю, все термины и определения. Это поможет глубже понимать то, что ты делаешь, и писать под другие программы: Автокад, Ворд, Эксель и т.д. Если объем слишком большой, можно разделить на два дня.

Golovanev

Цитата: p3452 от 30.08.21, 22:30:09Ну вот, один о "славе", другой - о букве...
- Нет, т.к. или "создание своего приложения (RTW)", или "создание своего приложения на различных языках".
Тут же главное, как славу добыть... Или приложения создавать, или форум засорять...

graphdark

Цитата: Алексей Дубовицкий от 30.08.21, 22:33:35API: как расширить возможности КОМПАС-3D
Благодарю, зарегистрировался.

IgorT

Цитата: Вират Лакх от 31.08.21, 02:48:10Не время важно, а эффект. Если целью является научить, то блок основ надо дать. Эдакий экскурс в историю, все термины и определения. Это поможет глубже понимать то, что ты делаешь, и писать под другие программы: Автокад, Ворд, Эксель и т.д. Если объем слишком большой, можно разделить на два дня.
Здорово! За два дня научат основам!
 Вират Лакх, Вы участвовали?
Подумалось... Сей семинар сделать бы не одноразовым  эффективным мероприятием, а постоянно действующим ресурсом  для обучения.  Не?
Хотя не понятно зачем это Аскону...

Вират Лакх

Цитата: IgorT от 31.08.21, 08:20:02За два дня научат основам!
Вират Лакх, Вы участвовали?
Подумалось... Сей семинар сделать бы не одноразовым  эффективным мероприятием, а постоянно действующим ресурсом  для обучения.  Не?
Хотя не понятно зачем это Аскону...
Я не говорил, что будет два дня, а что неплохо бы рассказать и показать подробно, даже если для этого понадобится второй день.
В чём участвовал? Вебинара еще не было. Я не при делах, если Вы имеете ввиду организацию процесса или выступление.
Просто подозреваю, что в эти два часа не войдет сухая и скучная теория о том, с чем мы там вообще имеем дело и как всё это устроено.
Например, там прозвучит слово "интерфейс". Вам оно что-то говорит? Научат с ним обращаться, а расскажут ли, что оно такое?
Мне было как-то не очень удобно оперировать тем, чего не знаешь. В общем, я надеюсь на подробный первый раздел "что такое API КОМПАС".
Так что я зарегался, посмотрим. Аскону это затем, чтобы люди умели пользоваться их продуктом и получался хороший "пользовательский опыт".

IgorT

Цитата: Вират Лакх от 31.08.21, 09:00:17...
Аскону это затем, чтобы люди умели пользоваться их продуктом и получался хороший "пользовательский опыт".
Тут ведь как получается... С одной стороны, возможно освоить АПИ Компаса и наваять такой функционал, что новые версии К совсем будут не нужны.
Такое возможно ведь? Что тогда будет останется Аскону?
С другой стороны можно отслеживать разработки пользователей по теме улучшения Компаса и добавлять эти улучшения (творчески доработанные специалистами Аскона) в функционал новых версий программы. Цель деятельности Аскона - получение прибыли. Разве не так?

СВ

Цитата: IgorT от 31.08.21, 09:21:15С другой стороны можно отслеживать разработки пользователей по теме улучшения Компаса и добавлять эти улучшения (творчески доработанные специалистами Аскона) в функционал новых версий программы. Цель деятельности Аскона - получение прибыли. Разве не так?
А как тут получится с "интеллектуальной собственностью"? Вот напишет чел программку с превращением серых кнопок в цветные, выложит её и что - АСКОН не сможет теперь сделать то же самое? Покупать права?

p3452

Цитата: IgorT от 31.08.21, 08:20:02Сей семинар сделать бы не одноразовым  эффективным мероприятием, а постоянно действующим ресурсом
Только за этот год:
1. Основные возможности КОМПАС-3D. Инженерная практика 2021, часть 1
2. Проектирование машин и механизмов в КОМПАС-3D. Инженерная практика 2021, часть 2
3. Применение КОМПАС-Электрик v19 в приборостроении. Инженерная практика 2021, часть 3
4. Валы и механические передачи 3D. Инженерная практика 2021, часть 4
5. Проектирование оборудования в КОМПАС-3D. Инженерная практика 2021, часть 5
6. Расчеты в КОМПАС-3D. Инженерная практика 2021, часть 6
7. Электроснабжение промышленных объектов. Инженерная практика 2021, часть 7
8. Технологическое проектирование. Инженерная практика 2021, часть 8
9. Проектирование воздушных линий электропередач и систем молниезащиты. Инженерная практика 2021, ч9

Но, "эффективность" оставляет желать лучшего...

Вират Лакх

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

Vi2

Цитата: Вират Лакх от 30.08.21, 18:43:30Я бы хотел услышать на мероприятии общую теорию: что такое COM, COM-объект простой и сложный, CLSID, GUID, классы, экземпляр класса, интерфейсы, IUnknown, регистрация библиотек типов и доступ к ним и т.д. И потом уже компас как пример всей этой кухни. Без фундамента некуда будет воспринять информацию.
Она так или иначе будет. Но там информации на десять минут.

COM (Component Object Model) - модель объекта, состоящего из компонентов.

Каждый компонент взаимодействует с другими компонентами и программами - клиентами этих компонентов - через объявленный и неизменный интерфейс, т.е. набор функций/методов/свойств/сообщений в зависимости от используемой инструментальной среды.

Важное качество СОМ - независимость от используемого языка программирования и среды разработки, хотя, конечно, они и вносят свои нюансы.

Все остальные названия - Automation (Автоматизация), ActiveX и прочие - только синонимы с некоторым оттенком, присущим синонимам.

Всё, теория закончилась. И теперь нужно рассказывать о самой модели объекта Компаса и составляющих его компонентах.

Golovanev

Цитата: p3452 от 31.08.21, 09:41:10Но, "эффективность" оставляет желать лучшего...

И как же гражданин p3452 оценивает эффективность проведенных АСКОН вебинаров? Критерии Ваши каковы?
Вот на моем вебинаре было более 120 участников. Все были довольны и информацией и общением.
Для меня
- Количество участников (более 120) более часа слушающих вебинар и не убежавших - это критерий.
- Значительный рост продаж в последующие месяцы после вебинара - это критерий.

У вас видимо есть доступ к подобной информации по всем вебинарам АСКОН?

graphdark

Цитата: IgorT от 31.08.21, 08:20:02Хотя не понятно зачем это Аскону...
Например, автодесковский ревит для строителей. В россии имеет целые подразделения, кто пишет по под нужды отдельного заказчика. Смысл в том, что путь в никуда-писать по, которое устроит до мелочей каждого. Можно дать инструмент и пусть точат по под себя. И потом можно это на поток поставить и предлагать не только канпас заводу, но и разработку отдельных утилит под производственный процесс. Это норма для всех зарубежных сапр. Солид, нх, катя. Канпас просто копирует то, что там было десятилетиями. Но мне это и хорошо.

IgorT

Цитата: graphdark от 31.08.21, 11:25:51... В россии имеет целые подразделения, кто пишет по под нужды отдельного заказчика. ...
Это где такие подразделения водятся? Я бы поучаствовал.

graphdark

Цитата: IgorT от 31.08.21, 11:30:51Это где такие подразделения водятся? Я бы поучаствовал.
Знакомый в москве в каком-то нии трудится. Штатно работает в нии. Но их конторой командует автодеск. Он на ++ пишет, что-то из их работы даже в релизы ревита попадает.

Цитата: p3452 от 30.08.21, 22:30:09Ну вот, один о "славе", другой - о букве...
- Нет, т.к. или "создание своего приложения (RTW)", или "создание своего приложения на различных языках".
На каком языке нельзя создать RTW?

Вират Лакх

Цитата: Вячеслав Никонов от 31.08.21, 21:47:15На каком языке нельзя создать RTW?
На сколько я знаю, на скриптовых типа Python нельзя.
Цитата: Vi2 от 31.08.21, 10:42:50Она так или иначе будет. Но там информации на десять минут.
...
Это слишком поверхностно. Например, если не рассказать, что у классов есть наследование свойств, то новичку может быть непонятно, почему мы можем написать IPart7.Update() при том, что в SDK у этого интерфейса в методах нет Update. Посмотрим вебинар в любом виде. И на том спасибо.

Vitalij Lysanov

Цитата: Вират Лакх от 01.09.21, 04:45:35Это слишком поверхностно. Например, если не рассказать, что у классов есть наследование свойств, то новичку может быть непонятно, почему мы можем написать IPart7.Update()


Можно посмотреть в первоисточнике, там все должно быть.
Первоисточник в одном месте, инструкция в другом.





class IPart7(DispatchBaseClass):
 'Компонент 3D документа.'
 CLSID = IID('{FA4A5FDE-A08C-4F5A-8C04-98395BA44307}')
 coclass_clsid = IID('{314057D1-5EFD-4980-8AB8-4E0CC3F7E756}')

 # Result is of type IVariable7
 def AddVariable(self, Name=defaultNamedNotOptArg, Value=defaultNamedNotOptArg, Note=defaultNamedNotOptArg):
 'Создать переменную(добавить переменную в массив переменных и документ).'
 ret = self._oleobj_.InvokeTypes(21, LCID, 1, (9, 0), ((8, 1), (5, 1), (8, 1)),Name
 , Value, Note)
 if ret is not None:
 ret = Dispatch(ret, 'AddVariable', '{8BAB52D9-8EF6-43A6-A1B8-AF42D5961A94}')
 return ret

 # Result is of type IKompasDocument3D
 def BeginEdit(self, Param=defaultNamedNotOptArg):
 'Войти в режим редактирования компонента сборки.'
 ret = self._oleobj_.InvokeTypes(30, LCID, 1, (9, 0), ((9, 1),),Param
 )
 if ret is not None:
 ret = Dispatch(ret, 'BeginEdit', '{7B60E769-06C3-4FDC-9677-7B5EF5180308}')
 return ret

 def ChangeObjectLinks(self, SourceObjs=defaultNamedNotOptArg, DestObjs=defaultNamedNotOptArg, RebuildAll=defaultNamedNotOptArg):
 'Заменить ссылки на объекты по всем операциям.'
 return self._oleobj_.InvokeTypes(35, LCID, 1, (11, 0), ((12, 1), (12, 1), (11, 1)),SourceObjs
 , DestObjs, RebuildAll)

 # Result is of type IModelObject
 # The method DefaultObject is actually a property, but must be used as a method to correctly pass the arguments
 def DefaultObject(self, Type=defaultNamedNotOptArg):
 'Получить предопределенные элементы(плоскости ось и СК).'
 ret = self._oleobj_.InvokeTypes(19, LCID, 2, (9, 0), ((3, 1),),Type
 )
 if ret is not None:
 ret = Dispatch(ret, 'DefaultObject', '{E37256D4-9021-47AC-8FAF-3713FB2A50C3}')
 return ret

 def DestroySubassembly(self):
 'Разрушить подсборку.'
 return self._oleobj_.InvokeTypes(43, LCID, 1, (11, 0), (),)

 def EndEdit(self, Rebuild=defaultNamedNotOptArg):
 'Завершить процесс редактирования компонента сборки.'
 return self._oleobj_.InvokeTypes(31, LCID, 1, (11, 0), ((11, 1),),Rebuild
 )

 # Result is of type IModelObject
 def FindObject(self, Obj=defaultNamedNotOptArg, SourcePart=defaultNamedNotOptArg):
 'Найти объект в текущем документе по объекту из другого документа.'
 ret = self._oleobj_.InvokeTypes(26, LCID, 1, (9, 0), ((9, 1), (9, 1)),Obj
 , SourcePart)
 if ret is not None:
 ret = Dispatch(ret, 'FindObject', '{E37256D4-9021-47AC-8FAF-3713FB2A50C3}')
 return ret

 def FindObjectsByPoint(self, X=defaultNamedNotOptArg, Y=defaultNamedNotOptArg, Z=defaultNamedNotOptArg, FirstLevel=defaultNamedNotOptArg):
 'Найти объекты по точке.'
 return self._ApplyTypes_(32, 1, (12, 0), ((5, 1), (5, 1), (5, 1), (11, 1)), 'FindObjectsByPoint', None,X
 , Y, Z, FirstLevel)

 # Result is of type IBody7
 def GetBodyById(self, BodyId=defaultNamedNotOptArg):
 'Возвращает тело заданное по идентификатору.'
 ret = self._oleobj_.InvokeTypes(46, LCID, 1, (9, 0), ((3, 1),),BodyId
 )
 if ret is not None:
 ret = Dispatch(ret, 'GetBodyById', '{4F122E22-0AA6-46E1-841F-A2504B145995}')
 return ret

 def GetDummyEmbodimentMarking(self, MarkingType=defaultNamedNotOptArg, AddSystemDelimer=defaultNamedNotOptArg):
 'Обозначение исполнения для макета'
 # Result is a Unicode object
 return self._oleobj_.InvokeTypes(54, LCID, 1, (8, 0), ((3, 1), (11, 1)),MarkingType
 , AddSystemDelimer)

 def GetMaxSag(self):
 'Максимально допустимый прогиб кривой или поверхности в соседних точках на расстоянии шага.'
 return self._oleobj_.InvokeTypes(44, LCID, 1, (5, 0), (),)

 # Result is of type IOpenDocumentParam
 def GetOpenDocumentParam(self):
 'Получить интерфейс параметров открытия документа для редактирования компонента сборки.'
 ret = self._oleobj_.InvokeTypes(29, LCID, 1, (9, 0), (),)
 if ret is not None:
 ret = Dispatch(ret, 'GetOpenDocumentParam', '{FADCA157-95B1-4E3F-97AA-622E34DA3238}')
 return ret

 # The method InstanceCount is actually a property, but must be used as a method to correctly pass the arguments
 def InstanceCount(self, Part=defaultNamedNotOptArg):
 'Количество вставок компонента.'
 return self._oleobj_.InvokeTypes(13, LCID, 2, (3, 0), ((9, 1),),Part
 )

 def IsLocalResultExist(self, Reqursive=defaultNamedNotOptArg):
 'Есть ли локальный результат в модели или во вставках.'
 return self._oleobj_.InvokeTypes(61, LCID, 1, (11, 0), ((11, 1),),Reqursive
 )

 def IsVariableNameValid(self, Name=defaultNamedNotOptArg):
 'Проверить допустимость создания новой переменной с данным именем'
 return self._oleobj_.InvokeTypes(20, LCID, 1, (11, 0), ((8, 1),),Name
 )

 def Load(self, Full=defaultNamedNotOptArg):
 'Загрузить.'
 return self._oleobj_.InvokeTypes(16, LCID, 1, (11, 0), ((11, 1),),Full
 )

 def MirroringPlacement(self, Axis=defaultNamedNotOptArg):
 'Изменить систему координат детали на зеркальную.'
 return self._oleobj_.InvokeTypes(42, LCID, 1, (11, 0), ((3, 1),),Axis
 )

 # Result is of type IKompasDocument3D
 def OpenSourceDocument(self, Param=defaultNamedNotOptArg):
 'Открытие документа-источника на редактирование.'
 ret = self._oleobj_.InvokeTypes(57, LCID, 1, (9, 0), ((9, 1),),Param
 )
 if ret is not None:
 ret = Dispatch(ret, 'OpenSourceDocument', '{7B60E769-06C3-4FDC-9677-7B5EF5180308}')
 return ret

 # The method PartsEx is actually a property, but must be used as a method to correctly pass the arguments
 def PartsEx(self, PartCollectionType=defaultNamedNotOptArg):
 'Массив SAFEARRAY компонентов.'
 return self._ApplyTypes_(12, 2, (12, 0), ((12, 1),), 'PartsEx', None,PartCollectionType
 )

 def RebuildModel(self, Redraw=defaultNamedNotOptArg):
 'Перестроить модель.'
 return self._oleobj_.InvokeTypes(22, LCID, 1, (11, 0), ((11, 1),),Redraw
 )

 def SaveAs(self, PathName=defaultNamedNotOptArg):
 'Сохранить файл компонента под другим именем.'
 return self._oleobj_.InvokeTypes(25, LCID, 1, (11, 0), ((8, 1),),PathName
 )

 def SelectByPoint(self, Objects=defaultNamedNotOptArg, X=defaultNamedNotOptArg, Y=defaultNamedNotOptArg, Z=defaultNamedNotOptArg):
 'Выделить объекты содержащие точку.'
 return self._ApplyTypes_(14, 1, (12, 0), ((12, 1), (5, 1), (5, 1), (5, 1)), 'SelectByPoint', None,Objects
 , X, Y, Z)

 def SetDummyEmbodiment(self, Index=defaultNamedNotOptArg):
 'Установить текущее исполнение для макета по имени или индексу.'
 return self._oleobj_.InvokeTypes(55, LCID, 1, (11, 0), ((12, 1),),Index
 )

 def SetMaterial(self, Name=defaultNamedNotOptArg, Density=defaultNamedNotOptArg):
 'Установить материал.'
 return self._oleobj_.InvokeTypes(9, LCID, 1, (11, 0), ((8, 1), (5, 1)),Name
 , Density)

 # The method SetUniqueNum is actually a property, but must be used as a method to correctly pass the arguments
 def SetUniqueNum(self, OType=defaultNamedNotOptArg, arg1=defaultUnnamedArg):
 'Уникальный номер объекта типа.'
 return self._oleobj_.InvokeTypes(34, LCID, 4, (24, 0), ((3, 1), (3, 1)),OType
 , arg1)

 def TransferObjects(self, Objects=defaultNamedNotOptArg, Lcs=defaultNamedNotOptArg, HoldPosition=defaultNamedNotOptArg):
 'Перенести в СК.'
 return self._oleobj_.InvokeTypes(15, LCID, 1, (11, 0), ((12, 1), (9, 1), (11, 1)),Objects
 , Lcs, HoldPosition)

 # The method UniqueNum is actually a property, but must be used as a method to correctly pass the arguments
 def UniqueNum(self, OType=defaultNamedNotOptArg):
 'Уникальный номер объекта типа.'
 return self._oleobj_.InvokeTypes(34, LCID, 2, (3, 0), ((3, 1),),OType
 )

 def Unload(self, Full=defaultNamedNotOptArg):
 'Выгрузить.'
 return self._oleobj_.InvokeTypes(17, LCID, 1, (11, 0), ((11, 1),),Full
 )

 def UnloadEx(self, Type=defaultNamedNotOptArg):
 'Выгрузить.'
 return self._oleobj_.InvokeTypes(56, LCID, 1, (11, 0), ((3, 1),),Type
 )

 def Update(self):
 'Изменить свойства объекта.'
 return self._oleobj_.InvokeTypes(503, LCID, 1, (11, 0), (),)

 def UpdatePlacement(self, Redraw=defaultNamedNotOptArg):
 'Установить локальную систему координат детали.'
 return self._oleobj_.InvokeTypes(39, LCID, 1, (11, 0), ((11, 1),),Redraw
 )

 _prop_map_get_ = {
 # Method 'Application' returns object of type 'IApplication'
 "Application": (1001, 2, (9, 0), (), "Application", '{6A2EFAF7-8254-45A5-9DC8-2213F16AF5D7}'),
 "CreateSpcObjects": (27, 2, (11, 0), (), "CreateSpcObjects", None),
 "Density": (7, 2, (5, 0), (), "Density", None),
 "Detail": (5, 2, (11, 0), (), "Detail", None),
 "DummyEmbodimentIndex": (53, 2, (3, 0), (), "DummyEmbodimentIndex", None),
 "DummyFileName": (52, 2, (8, 0), (), "DummyFileName", None),
 "FileName": (2, 2, (8, 0), (), "FileName", None),
 "Fixed": (4, 2, (11, 0), (), "Fixed", None),
 # Method 'HatchParam' returns object of type 'IHatchParam'
 "HatchParam": (33, 2, (9, 0), (), "HatchParam", '{437D6587-7649-4A0C-80BB-7A6E89661839}'),
 "Hidden": (502, 2, (11, 0), (), "Hidden", None),
 "InheritExclude": (59, 2, (11, 0), (), "InheritExclude", None),
 "InheritVisible": (63, 2, (11, 0), (), "InheritVisible", None),
 "IsBillet": (37, 2, (11, 0), (), "IsBillet", None),
 "IsLayoutGeometry": (36, 2, (11, 0), (), "IsLayoutGeometry", None),
 "IsLocal": (28, 2, (11, 0), (), "IsLocal", None),
 "LeftHandedCS": (41, 2, (11, 0), (), "LeftHandedCS", None),
 "LoadState": (18, 2, (3, 0), (), "LoadState", None),
 "Marking": (1, 2, (8, 0), (), "Marking", None),
 "Mass": (6, 2, (5, 0), (), "Mass", None),
 # Method 'MateConstraints' returns object of type 'IMateConstraints3D'
 "MateConstraints": (45, 2, (9, 0), (), "MateConstraints", '{95F316E1-0A18-4F42-8B70-1423250F244D}'),
 "Material": (8, 2, (8, 0), (), "Material", None),
 "ModelObjectType": (506, 2, (3, 0), (), "ModelObjectType", None),
 "Name": (501, 2, (8, 0), (), "Name", None),
 # Method 'Owner' returns object of type 'IFeature7'
 "Owner": (507, 2, (9, 0), (), "Owner", '{EF4343FA-985D-4FE9-AD5F-439BC8F92958}'),
 # Method 'Parent' returns object of type 'IKompasAPIObject'
 "Parent": (1000, 2, (9, 0), (), "Parent", '{5C799A83-C0A4-4312-BEB0-21CBD7FF4C13}'),
 # Method 'Part' returns object of type 'IPart7'
 "Part": (505, 2, (9, 0), (), "Part", '{FA4A5FDE-A08C-4F5A-8C04-98395BA44307}'),
 # Method 'Parts' returns object of type 'IParts7'
 "Parts": (10, 2, (9, 0), (), "Parts", '{42F8FCEF-E56F-466C-8814-BEBAC0719AE6}'),
 "PartsGroupNumber": (60, 2, (3, 0), (), "PartsGroupNumber", None),
 # Method 'Placement' returns object of type 'IPlacement3D'
 "Placement": (38, 2, (9, 0), (), "Placement", '{9C66DE49-529C-4678-9AF1-12710CB77804}'),
 "ReadOnly": (23, 2, (3, 0), (), "ReadOnly", None),
 "Reference": (1003, 2, (3, 0), (), "Reference", None),
 "RevealComposition": (62, 2, (11, 0), (), "RevealComposition", None),
 # Method 'SpecRough' returns object of type 'ISpecRough3D'
 "SpecRough": (40, 2, (9, 0), (), "SpecRough", '{AED8F9FC-E493-4CBD-9341-9D9E39E14FDC}'),
 "StaffVisible": (24, 2, (11, 0), (), "StaffVisible", None),
 "Standard": (3, 2, (11, 0), (), "Standard", None),
 "ToleranceRecalcType": (48, 2, (3, 0), (), "ToleranceRecalcType", None),
 "Type": (1002, 2, (3, 0), (), "Type", None),
 "UseDummy": (51, 2, (11, 0), (), "UseDummy", None),
 # Method 'UserFolders' returns object of type 'IUserFolders'
 "UserFolders": (47, 2, (9, 0), (), "UserFolders", '{0155AE59-92F4-4CEE-9633-8ADA943388CB}'),
 "UserToleranceRecalcId": (49, 2, (3, 0), (), "UserToleranceRecalcId", None),
 "UserToleranceRecalcName": (50, 2, (8, 0), (), "UserToleranceRecalcName", None),
 "Valid": (504, 2, (11, 0), (), "Valid", None),
 # Method 'VariableTable' returns object of type 'IVariableTable'
 "VariableTable": (11, 2, (9, 0), (), "VariableTable", '{2B8B154E-ED76-4FF0-B3E4-FEE691D014A4}'),
 # Method 'ZonesManager' returns object of type 'IZonesManager'
 "ZonesManager": (58, 2, (9, 0), (), "ZonesManager", '{0B93D860-69EC-4D03-8A1D-EB0C936B1D45}'),
 }
 _prop_map_put_ = {
 "CreateSpcObjects": ((27, LCID, 4, 0),()),
 "DummyFileName": ((52, LCID, 4, 0),()),
 "FileName": ((2, LCID, 4, 0),()),
 "Fixed": ((4, LCID, 4, 0),()),
 "Hidden": ((502, LCID, 4, 0),()),
 "InheritExclude": ((59, LCID, 4, 0),()),
 "InheritVisible": ((63, LCID, 4, 0),()),
 "IsBillet": ((37, LCID, 4, 0),()),
 "IsLayoutGeometry": ((36, LCID, 4, 0),()),
 "IsLocal": ((28, LCID, 4, 0),()),
 "LeftHandedCS": ((41, LCID, 4, 0),()),
 "Marking": ((1, LCID, 4, 0),()),
 "Name": ((501, LCID, 4, 0),()),
 "PartsGroupNumber": ((60, LCID, 4, 0),()),
 "ReadOnly": ((23, LCID, 4, 0),()),
 "RevealComposition": ((62, LCID, 4, 0),()),
 "StaffVisible": ((24, LCID, 4, 0),()),
 "Standard": ((3, LCID, 4, 0),()),
 "ToleranceRecalcType": ((48, LCID, 4, 0),()),
 "UseDummy": ((51, LCID, 4, 0),()),
 "UserToleranceRecalcId": ((49, LCID, 4, 0),()),
 "UserToleranceRecalcName": ((50, LCID, 4, 0),()),
 }
 def __iter__(self):
 "Return a Python iterator for this object"
 try:
 ob = self._oleobj_.InvokeTypes(-4,LCID,3,(13, 10),())
 except pythoncom.error:
 raise TypeError("This object does not support enumeration")
 return win32com.client.util.Iterator(ob, None)





Еще есть про интерфейсы (написано что с форума):



COM (англ. Component Object Model «модель компонентного объекта»; произносится как [ком]) -- это технологический стандарт от компании Microsoft, предназначенный для создания программного обеспечения на основе взаимодействующих компонентов объекта, каждый из которых может использоваться во многих программах одновременно.

COM - это технология, позволяющая объектам взаимодействовать, несмотря на границы процесса или машины, так же легко, как и объектам внутри одного процесса.

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

Термин «интерфейс», о котором речь пойдет чуть ниже, означает реализацию в коде COM-совместимого двоичного интерфейса, ассоциированного с объектом.

COM-объект можно сравнить с объектом в понимании С++, VB или Java. Объект СОМ - это некоторая сущность, имеющая состояние и методы доступа, позволяющие изменять это состояние.

СОМ-объекты можно создавать прямым вызовом специальных функций, но напрямую уничтожить его невозможно.

Так, в COM присутствует понятие класса. Класс в COM носит название CoClass.

CoClass - это класс, поддерживающий набор методов и свойств (один или более), с помощью которых можно взаимодействовать с объектами этого класса. Такой набор методов и свойств называется интерфейсом (Interface).

Каждый CoClass имеет два идентификатора - один из них, текстовый, называется ProgID и предназначен для человека, а второй, бинарный, называется CLSID.

CLSID является глобально уникальным идентификатором (GUID).

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

С помощью CLSID можно точно указать, какой именно объект требуется. Тип данных GUID применяется и для идентификации COM-интерфейсов.

В этом случае он называется IID. Сгенерировать новое значение типа GUID можно с помощью API-функции Win32 CoCreateGuid.

На практике использовать эту функцию приходится не часто, так как современные средства разработки полностью автоматизируют эту задачу, а VB вообще скрывает от программиста такие тонкости, как работу с CLSID и IID.


Для создания экземпляра объекта используется CLSID. Если имеется только ProgID CoClass'а или CLSID в строковом виде ("{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} ", где X - шестнадцатеричная цифра), то CLSID можно получить, вызвав функцию CLSIDFromString.

Для случая с ProgID информация о CoClass'е должна содержаться в реестре машины, на которой производится вызов функции. В реестр информация заносится автоматически при регистрации объекта (во время процедуры инсталляции или при компиляции).

Программист никогда не взаимодействует с объектом и его данными напрямую. Для этого используются интерфейсы объектов.

В понимании СОМ интерфейс - это контракт, состоящий из списка связанных прототипов функций, чье назначение определено, а реализация - нет. Эти прототипы функций эквивалентны абстрактным базовым классам С++, то есть классам, имеющим только виртуальные методы, описания без реализации.
Определение интерфейса описывает функции-члены интерфейса, называемые методами, типы их возвращаемого значения, число и типы их параметров, а также описывает, что они, собственно, должны делать. Напрямую с интерфейсом не ассоциировано никакой реализации.


Реализация интерфейса (interface implementation) - это код, который программист создает для выполнения действий, оговоренных в определении интерфейса. Реализации интерфейсов, помещенные в COM-библиотеки или exe-модули, могут использоваться при создании объектно-ориентированных приложений. Разумеется, программист может игнорировать эти реализации и создать собственные.

Интерфейсы ассоциируются с CoClass'ами. Чтобы воспользоваться реализацией функциональности интерфейса, нужно создать экземпляр объекта соответствующего класса, и запросить у этого объекта ссылку на соответствующий интерфейс.

Например, для описания взаимодействия с некоторым абстрактным стеком можно определить интерфейс IStack (в COM стало доброй традицией начинать названия интерфейсов с «I»).

Этот интерфейс может содержать два метода, скажем, Push и Pop. Вызов метода Pop возвращает значения, заложенные до этого методом Push в стек, но в обратном порядке. Это определение интерфейса не говорит, как функции будут реализованы в коде. Один программист может реализовать стек как массив, а методы Push и Pop - как методы доступа к этому массиву. Другому же взбредет в голову использовать связанный список и соответствующую реализацию методов. Независимо от конкретной реализации методов, представление в памяти указателя на интерфейс IStack, и, соответственно, его использование клиентом полностью специфицируется определением интерфейса.

Простые объекты могут поддерживать только один интерфейс. Более сложные объекты, как правило, поддерживают несколько интерфейсов. Это свойство позволяет реализовать полиморфизм на уровне компонентной модели.

Слово «интерфейс» используется в COM не в том смысле, что в С++. Интерфейс в С++ ссылается на все функции, поддерживаемые классом. COM-интерфейс ссылается на предварительно оговоренную группу связанных функций, реализуемых COM-классом, но не обязательно на ВСЕ функции, поддерживаемые классом.

СОМ поддерживает реализацию нескольких интерфейсов в одном объекте, и поэтому требует отдельного определения класса объекта (см. "CoClass").

Экземпляр «реализации интерфейса» на самом деле является указателем на массив указателей на методы (таблицу функций, ссылающуюся на реализации всех методов, определенных в интерфейсе, также называемую виртуальной таблицей - VTbl). Объекты с несколькими интерфейсами могут предоставлять указатели на несколько таблиц функций. Любой код, содержащий указатель, через который он имеет доступ к массиву, может вызывать методы этого интерфейса.

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


Интерфейс имеет свое имя. Как мы уже говорили, каждый интерфейс - это неизменяемый контракт, во время исполнения определяемый по глобально уникальному идентификатору интерфейса, IID.

IID, это особая разновидность GUID, позволяет клиентам точно и без ненужных сложностей, узнать у объекта, поддерживает ли он некоторый интерфейс. Идентификация интерфейсов по IID решает проблему неуникальности имен интерфейсов.

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

Все интерфейсы должны быть унаследованы от интерфейса IUnknown. IUnknown содержит три жизненно важных для COM метода: QueryInterface, AddRef и Release. Все COM-объекты должны реализовать интерфейс IUnknown, поскольку он обеспечивает возможность получать поддерживаемые объектом интерфейсы с помощью QueryInterface, и управлять сроком жизни объекта через AddRef и Release.

Высокоуровневые средства разработки (такие, как VB) полностью скрывают реализацию IUnknown, облегчая тем самым работу программиста.


Чтобы воспользоваться функциональностью COM-объекта, нужно создать его экземпляр (instance).


Интерфейс...
Тип данных: BOOL
Синтаксис Automation:
HiddenObjectsVisible = Object.HiddenObjectsVisible   Получить свойство (* )

Object.HiddenObjectsVisible = HiddenObjectsVisible   Установить свойство (* )

HiddenObjectsVisible = Object.GetHiddenObjectsVisible()   Получить свойство (**)

Object.SetHiddenObjectsVisible( HiddenObjectsVisible )   Установить свойство (**)

Синтаксис COM:
Object.get_HiddenObjectsVisible( &HiddenObjectsVisible )   Получить свойство
Object.put_HiddenObjectsVisible( HiddenObjectsVisible )   Установить свойство
Примечание:
Свойство позволяет устанавливать и получать признак отображения скрытых объектов.
 

Интерфейс...
Тип данных: VARIANT
Синтаксис Automation:
SubFeatures = Object.SubFeatures( treeType, through, libObject )   Получить свойство (* )

SubFeatures = Object. GetSubFeatures ( treeType, through, libObject )   Получить свойство (**)

Синтаксис COM:
Object.get_SubFeatures( treeType, through, libObject, &SubFeatures )   Получить свойство
Параметры:
treeType   - тип дерева из перечисления ksTreeTypeEnum,

through   - TRUE - выдавать все объекты, даже скрытые,
libObject   - TRUE - выдавать содержимое для библиотечного элемента.
Примечание:
Свойство доступно только для чтения.
 

Интерфейс...
Синтаксис Automation:
LPDISPATCH SubFeatureCollection (BOOL through, BOOL libObject);
Синтаксис COM:
LPFEATURECOLLECTION SubFeatureCollection (BOOL through, BOOL libObject);
Входные параметры:
Through   TRUE   - выдавать все объекты, включая скрытые,
libObject   TRUE   - выдавать состав библиотечных элементов.
Возвращаемое значение:
    - указатель на интерфейс ksFeatureCollection или IFeatureCollection.



Вират Лакх

Цитата: Vitalij Lysanov от 01.09.21, 07:37:41Можно посмотреть в первоисточнике, там все должно быть. Первоисточник в одном месте, инструкция в другом.
Мы-то посмотрим. Я к тому, чтобы про это рассказали на вебинаре.

Цитата: Vitalij Lysanov от 01.09.21, 07:37:41Еще есть про интерфейсы (написано что с форума):
Так это я и писал :) https://forum.ascon.ru/index.php?msg=283796
Ну, не совсем писал, а надёргал в основном из сайта по ссылке http://rsdn.org/article/com/COMvs.xml, которую ранее предоставил ув. Slaviation https://forum.ascon.ru/index.php?msg=255732
Что-то подобное сначала должно лечь в основу, а дальше уже про компас. Но это я уже не первый раз повторяюсь...

KrissKross

#38
мне наоборот не хотелось бы слышать про основы COM объектов
эту информацию можно подчерпнуть из других источников

а лучше сосредоточиться непосредственно на взаимодействии с Компасом
1. Трюки
2. Какие-то неочевидные вещи
3. Новинки
4. Планы развития
5. Упрощенная возможность получения лицензии на Компас-3Д для разработчиков
6. Некий специализированный портал - чисто для разработчиков сторонних приложений
7. Магазин приложений в конце концов, с верификацией и помощи в продвижении

IgorT

Цитата: KrissKross от 01.09.21, 08:54:36мне наоборот не хотелось бы слышать про основы COM объектов
эту информацию можно подчерпнуть из других источников

а лучше сосредоточиться непосредственно на взаимодействии с Компасом

...
6. Некий специализированный портал - чисто для разработчиков сторонних приложений
...
Ну да. Я о том же...
Хотя на форуме есть раздел по программированию. Чем не "спец.портал"?