Подскажите где найти литературу для самостоятельного обучения программированию для компаса на питоне? Я не программист, но ручками рисовать целый день то, что можно автоматизировать, уже надоело. Помогите, не знаю с чего начать.
На пайтоне вроде ничего нет, есть книжка:
"Разработка приложений под КОМПАС в Delphi"
+ есть SDK если у вас есть опыт работы с Python, то может и этой справки хватить.
ну а так можно или задавать конкретный вопрос на форуме или посмотреть какие макаросы пишут тут (https://vk.com/topic-29994774_26653498?offset=160) самоучки-инженеры. Там нет С++ и Delphi. Только VBA и Python.
Спасибо. Еще подскажите, где-нибудь встречаются примеры макросов с подробными комментариями кода? Или описание библиотек, которые используются в питоне. К примеру, я вижу функцию iDocument2D.ksLineSeg в одном из примеров, как мне узнать, что она делает?
Заранее извиняюсь, если эти вопросы кажутся глупыми, но пока знаний никаких...
Запустить справку SDK, вести ksLineSeg и почитать.
Алхимик, по ссылке "тут" ничего нет...
Там ссылка на группу в ВК и тему по созданию пару макросов. Но там особо серьезных туторов нет.
Алхимик, спасибо большое за отправную точку. Делай побольше видео с описанием кода, буду следить за тобой на ютубе.
Цитата: Alal от 26.03.16, 09:13:20
... Я не программист, но ручками рисовать целый день то, что можно автоматизировать, уже надоело. ...
Если можно, расскажите, кто Вы по сути:
- конструктор, который способен программировать;
- программист, которому приходится конструировать?
В какой области Вы работаете; часто ли встречаются в работе повторяющиеся детали, элементы?
Цитата: СВ от 28.03.16, 13:37:23
- конструктор, который способен программировать;
- программист, которому приходится конструировать?
В какой области Вы работаете; часто ли встречаются в работе повторяющиеся детали, элементы?
Что вам даст ответы на эти вопросы?
ПС судя по тому что пишется в теме и по названию, это не программист.
ПС2 программирование может помочь во многом, вот там по ссылке в ВК, люди буквально за неделю смогли написать норм макрос. Который будет пересчитывать гибы, макрос на создания текста в таблице (за вечер).
Вот нужно человеку два дня потратить на заполнение таблиц, а он за 5 часов написал макрос с нуля и заполнил таблицу за 1 минуту. А если маленькая контора и сроки горят, тогда и начальник еще наградит.
Сергей Павлович, я очень рад, что помог пристроить этот "элемент производственного юмора", но вопрос всё-таки не снимается.
Цитата: СВ от 28.03.16, 14:59:54
Сергей Павлович, я очень рад, что помог пристроить этот "элемент производственного юмора", но вопрос всё-таки не снимается.
я тоже не очень понимаю зачем вопрос. с помощью правильного макроса можно многое автоматизировать.. Почти все если быть точным) Один мой друг - хороший программист говорит - я вот иногда мечтаю, стать офисным работником. Написать кучу программ и ничего не делать в целыми днями. И я готов с ним согласиться, что это возможно.
Сергей Павлович, n00ze, ВСЁ-ТАКИ, я могу спросить у Alalа что мне нужно, или нет?
СВ, конечно можете спросить! :)
Я инженер-проектировщик, занимаюсь в основном проектированием наружных инженерных коммуникаций. Специальность ПГС. На программиста не учился и программированием не занимался.
Организация у нас маленькая, работа разнообразная, поэтому специализированного программного обеспечения нет. При проектировании сетей возникает куча работы, которую на мой взгляд можно и нужно автоматизировать. К примеру, сеть водоснабжения поселка длиной 10 км может состоять из >500 отдельных участков. На каждом участке должны быть указаны его длина и обозначение трубы. Работа может выполняться за секунду, но занимает часа три. И таких примеров много. Из-за этого проектирование превращается в конвейер с кучей маленьких элементов чертежа.
При необходимости, сделать маленькую программку, для меня никогда не было проблемой. Но научить, что-то делать компас для меня оказалось проблемой. Сходу не осилил, поэтому пришел сюда за помощью.
Alal, предлагаю такой roadmap
1.
Нужно установить Python и его расширение Pywin32
для x86
https://www.python.org/ftp/python/2.7.9/python-2.7.9.msi
http://sourceforge.net/projects/pywin32/files/pywin32/Build%20219/pywin32-219.win32-py2.7.exe/download
для x64
https://www.python.org/ftp/python/2.7.9/python-2.7.9.amd64.msi
http://sourceforge.net/projects/pywin32/files/pywin32/Build%20219/pywin32-219.win-amd64-py2.7.exe/download
2. Почитать об основах программирования на Python. Если совсем нет времени на это, то иметь под рукой
удобный cheat sheet, к примеру http://www.cheatography.com/davechild/cheat-sheets/python/pdf/
3. В качестве исходного примера можно использовать файл из вложения start_step.pyw, в котором реализовано полуение
интерфейсов к обеим версиям api КОМПАС и к используемым константам КОМПАС.
i_kompas_api_object - Базовый объект КОМПАС API IKompasAPIObject (api версии 7)
kompas_object - KompasObject - Интерфейс API КОМПАС (api версии 5)
Использовать можно любую версию api или обе сразу. Каждая версия покрыает свою часть функционала
КОМПАС (так наверное сложилось исторически:)
4. Пользуясь справкой по SDK КОМПАС (SDK.chm) начать пробовать получать дочерние от IKompasAPIObject или KompasObject интерфейсы,
использовать их свойства и методы, продвигаться к решению поставленной задачи.
5. Заглядывать в обучающие примеры в каталогах
C:\Program Files\ASCON\KOMPAS-3D V16\SDK\C++\VisualcAUTO\
или в
C:\Program Files\ASCON\KOMPAS-3D V16\SDK\Pascal\DELPHIAUTO\
хоть они и не на Python.
Подскажите, если я в активном 2D документе выделяю несколько отрезков и хочу узнать координаты их начальных и конечных точек, как мне это сделать? В SDK смотрел, но не могу найти нужные мне методы, как я их вижу.
Если не сложно, желательно показать на примере в питоне или на край в паскале, синтаксис С, бейсика и тд совсем не понимаю
PS Еще раз говорю, ничем таким не занимался, поэтому все для меня туго для понимания. Не глумитесь :)
Такие методы как ksLineSegParam и GetParamStruct я нашел, но как работать именно с выделенными объектами?
Самому интересно, тут наверное ответят более конкретно.
В группе ВК был макрос от одного программиста АСКОН, который разукрашивал выбранные грани, можно там посмотреть как происходил выбор. Посмотреть сейчас не могу ВК, но помнится где то в начале темы про макросы.
Точно! помню такое, ничего тогда не понял, просто пролистал. Надо пересмотреть.
Сегодня пришел на работу, написал одну строчку, и до сих пор сижу довольный:
Обучение, обучением, а вот исходников закоментированных мало выкладывается
Вот тот макрос с выделение, есть у кого подобное с 2D объектами?
#!/usr/bin/python
# -*- coding: cp1251 -*-
# |change color
import Kompas10API5 as KAPI
from win32com.client import Dispatch
import LDefin2D
import LDefin3D
iKompasObject = Dispatch('KOMPAS.Application.5')
iKompasObject = KAPI.KompasObject(iKompasObject)
iDocument3D = iKompasObject.ActiveDocument3D()
SlcMan = iDocument2D.GetSelectionMng()
Count = SlcMan.GetCount()
n=0
Face0 = SlcMan.GetObjectByIndex (0)
ColorFace0 = Face0.ColorParam()
color0 = ColorFace0.color
for n in range(0,Count,1):
Face = SlcMan.GetObjectByIndex (n)
ColorFace = Face.ColorParam()
color = ColorFace.color
ColorFace.color = color0
Face.Update ()
SlcMan.UnselectAll ()
ЦитироватьПодскажите, если я в активном 2D документе выделяю несколько отрезков и хочу узнать координаты их начальных и конечных точек, как мне это сделать? В SDK смотрел, но не могу найти нужные мне методы, как я их вижу.
Если не сложно, желательно показать на примере в питоне или на край в паскале, синтаксис С, бейсика и тд совсем не понимаю
PS Еще раз говорю, ничем таким не занимался, поэтому все для меня туго для понимания. Не глумитесь
Пример в прицепе.
В примере нет проверок на наличие/отсутствие чего-либо, поэтому откройте в КОМПАС чертеж, выделите несколько объектов, среди которых есть отрезки.
В проводнике встаньте на файл test.pyw, вызовите контекстное меню, выберите пункт "Edit with IDLE" или "Edit with Pythonwin", после того как код примера откроется в редакторе нажмите F5.
Координаты отрезков будут выведены в интерактивное окно редактора.
if isinstance(selected_objects, tuple): # выделяю несколько
for object in selected_objects:
if object.DrawingObjectType is not const.ksDrLineSeg: # отрезков
continue
line_segment = module.ILineSegment(object)
print "x1: ", line_segment.X1, " y1: ", line_segment.Y1 # хочу узнать координаты их начальных и конечных точек
print "x2: ", line_segment.X2, " y1: ", line_segment.Y2
print "Length: ", line_segment.Length
print "Angle: ", line_segment.Angle
print "---"
Добавил 2 строки, интересно работает. Длины и угла.
Для чего вы добавили "tuple" - кортеж?
По какому принципу определяется последовательность отрезков с которых считываем данные? Random?
ЦитироватьДля чего вы добавили "tuple"
if isinstance(selected_objects, tuple): - это проверка того, что selected_objects является кортежем, т.е. что было селектировано более одного объекта.
Если был выделен один объект, то selected_objects это он и есть.
ЦитироватьПо какому принципу определяется последовательность отрезков с которых считываем данные? Random?
Не знаю, ответ наверное нужно искать в реализации ISelectionManager.
Цитата: Slaviation от 31.03.16, 11:11:32
Искать в реализации ISelectionManager.
Из-за этого пункта у нас получается кортеж? А не просто список. Хотел установить для отрезков длинной больше 50мм стиль - тонкая. Ошибка не выводится, но и ничего и не изменяется.
В общем - матчасть наше все 88))
ЦитироватьХотел установить для отрезков длинной больше 50мм стиль - тонкая. Ошибка не выводится, но и ничего и не изменяется.
В прицепе пример, в котором меняется стиль линии на "тонкая" у селектированных отрезков длинной более 50 мм.
Т.е. до "Update" у нас просто идет чтение нужной информации Пайтоном с Компаса? Очень интересно :shu:
Получается мы сначала выбираем в каком документе мы хотим работать. И потом поиском связываем концы?
Пока не вижу иерархии или ее там нет и это "словарь" с понятиями и определениями?
Для примера чтобы использовать свойства печати, необходимо так делать? Код не обязателен, нужна удочка, а не рыбка 88))
Смотрю внимательней, а тут еще и такой интерфейс есть... мне не нужно ничего печатать, иллюстрации как пример, бывает какая то задвоенность( интерфейсов и методов((
Как в Python'е получить коллекцию точек чертежа и потом выделить часть из них, чьи координаты удовлетворяют какому-то условию.
Знаю, что через свойство Points интерфейса IDrawingContainer, но не могу добраться до него. В SDK путаюсь.
Код из примеров библиотеки Pik10 должен помочь:
# coding: cp1251
# 2D-API|step3
Kompas, doc2d = start2d()
import Kompas6API5, LDefin2D
example = 10
read(example='3.Пример')
if example in (10,0): # Cоздать точку
# Cтиль отрисовки точки
# 0-точка, 1-крестик, 2-х-точка, 3-квадрат, 4-треугольник, 5-окружность, 6-звезда,
# 7-перечеркнутый квадрат
doc2d.ksMtr( 10, 10, 0, 1, 1 ) # Матрица преобразования координат ( 10 по оси OX, 10 по оси OY )
p = doc2d.ksPoint( 30, 40, 0 ) # Создать точку
doc2d.ksPoint( 40, 40, 1 )
doc2d.ksPoint( 50, 40, 2 )
doc2d.ksPoint( 60, 40, 3 )
doc2d.ksPoint( 70, 40, 4 )
doc2d.ksPoint( 80, 40, 5 )
doc2d.ksPoint( 90, 40, 6 )
doc2d.ksPoint( 100,40, 7 )
doc2d.ksDeleteMtr() # Отключение матрицы преобразования координат
# Взять параметры точки
par = Kompas6API5.ksPointParam(Kompas.GetParamStruct( LDefin2D.ko_PointParam ))
t = doc2d.ksGetObjParam( p, par, LDefin2D.ALLPARAM ) # Взять параметры точки
out =["t = ", t, " x = ", par.x, " y = ", par.y, " style = ", par.style]
Kompas.ksMessage( ' '.join( map( unicode, out ) ) ) # Вывод
# Задать параметры окружности
par.x = 20 # Координаты точки
par.y = 30
par.style = 7 # Cтиль отрисовки точки
if doc2d.ksSetObjParam( p, par, LDefin2D.ALLPARAM ): # Заменить параметры точки
Kompas.ksMessage( "Изменили объект")
else:
Kompas.ksMessageBoxResult() # Выдать сообщение об ошибке на экран
par = None
Спасибо за ответ! А что это за библиотека Pik10? Может там ещё чего полезного для новичков имеется?
Библиотека Pik10 шла к Компасу 8 или 9.
https://yadi.sk/d/u3UR4BJqrYavH
https://yadi.sk/d/9W2kwhxxuie68
На сколько мне известно, вроде как бы на форуме не предполагалось обучение... :shu:
Да разделов на самом форуме программирование приложений, ну ещё может быть один, два каких то...
На этом подзаработать не получиться... :%:
Это ж форум пользователей готовыми логически сформированными (не требующие, проектирования, разработки, заново, разве что, введение редких мелких промахов изменений, а может быть есть и такой коротенький список этих промахов) программными продуктами КОМПАС, ЛОЦМАН, Renga, Pilot-ICE, ВЕРТИКАЛЬ, ну ещё Корпоративных Справочников и прикладных библиотек. ....
Остальное взаимопомощь в проектировании, формирование комплектов проектной документации....
Прошу прощения если что не так... >:(
Пытаюсь получить длину отрезка контура (Length = iContourLineSegment.Length()),
но эта строка выбивает ошибку: 'float' object is not callable.
P.S.: Имя Length в коде до этого нигде не встречается.
UPD. Вопрос решился. Оказалось скобки в конце были лишними.
Правильная запись:Length = iContourLineSegment.Length
Кусок кода:
iDrawingContours = iDrawingContainer.DrawingContours
# перебираем все контуры
iIterator = Dispatch('KOMPAS.Application.5').GetIterator
iIterator.ksCreateIterator( 26, 0 )#CONTOUR_OBJ
obj = iIterator.ksMoveIterator( "F" )
if obj <> 0:
iDrawingContour = iDrawingContours.DrawingContour(obj)# тут нужно указать номер контура в коллекции
iContour = iDrawingContour._oleobj_.QueryInterface(KAPI7.NamesToIIDMap['IContour'], pythoncom.IID_IDispatch)
iContour = KAPI7.IContour(iContour)
N = iContour.Count #узнаём кол-во сегментов в контуре
for i in (0,N-1):
iContourSegment = iContour.Segment(i)
iContourLineSegment = iContourSegment._oleobj_.QueryInterface(KAPI7.NamesToIIDMap['IContourLineSegment'], pythoncom.IID_IDispatch)
iContourLineSegment = KAPI7.IContourLineSegment(iContourLineSegment)
Length = iContourLineSegment.Length()
ЦитироватьКак в Python'е получить коллекцию точек чертежа и потом выделить часть из них, чьи координаты удовлетворяют какому-то условию.
Знаю, что через свойство Points интерфейса IDrawingContainer, но не могу добраться до него. В SDK путаюсь.
В прицепе пример на Python.
Запускать на активном чертеже в котором есть точки.
Цитата: Slaviation от 28.02.17, 08:10:04
В прицепе пример на Python.
Запускать на активном чертеже в котором есть точки.
Я немного иначе делал. Во вложении мой код. Вроде бы и работает, но на чертеже точки не выделяются(читай " подсвечиваются зелёным").
Цель такая: выделяем окружность на чертеже и программа сама выделяет точки, которые попадают внутрь этой окружности. Чтобы эти точки мы потом смогли либо удалить, либо переместить мышью, либо скопировать и т.п.
Вариант с селектированием точек, лежащих внутри окружности.
Запускать на активном чертеже, в котором есть точки и одна выделенная окружность.
Точки, лежащие внутри окружности будут селектированы
Цитата: Slaviation от 28.02.17, 11:58:46
Вариант с селектированием точек, лежащих внутри окружности.
Запускать на активном чертеже, в котором есть точки и одна выделенная окружность.
Точки, лежащие внутри окружности будут селектированы
Спасибо за помощь!
Доработал код, теперь проблем с выделением нет.
Новая проблема. Как подписываться на события для окон документов (ksDocumentFrameNotify)?
Мне нужно поймать момент, когда нажата левая кнопка мыши.
Делал так
KAPI7.ksDocumentFrameNotify(3)
выходит ошибка
File "C:\Python26\lib\site-packages\Pythonwin\Kompas10API7.py", line 29462, in __init__
cpc=oobj._oleobj_.QueryInterface(pythoncom.IID_IConnectionPointContainer)
AttributeError: 'int' object has no attribute '_oleobj_'
И ещё вопрос, как программно завершить выполнение команды, вызванной через ksExecuteKompasCommand?
Проверить, что процесс запущен, если да, тогда остановить StopCurrentProcess.
С событиями всё намного сложнее, я вообще не уверен, что Питон их поддерживает, т.к. нужно на них подписаться затем отписаться.
В качестве примера можете посмотреть SDK\Samples\Pascal\Delphi\step12\ApplicationEvents.pas, тут как раз идет реализация класса на обработку событий приложения, в числе которых - события мыши.
Я создаю временную группу из выборочных объектов вида,и хочу очистить вид, чтобы вставить в него объекты из временной группы. Как удалить все объекты вида?
VGrupp:=NewGroup(0);
EndGroup;
SelectGroup(VGrupp,2,10E16,10E16,10E16,10E16);
DeleteObj(VGrupp);
Цитата: Sabahs от 03.04.17, 13:15:31
VGrupp:=NewGroup(0);
EndGroup;
SelectGroup(VGrupp,2,10E16,10E16,10E16,10E16);
DeleteObj(VGrupp);
Благодарю! Ответ как всегда точно в цель, код работает.
Но для общего, так сказать, развития хотелось бы прояснить для себя некоторые моменты.
"10E16,10E16,10E16,10E16" - координаты прямоугольника-ловушки. Судя по значениям координат, это точка в районе
планеты Плутон. Из каких соображений выбраны именно эти координаты?
Фактически ловушка равна нулю и стоит далеко от начала координат, чтобы выделить всё, что в неё не попадёт, а попасть туда 100% ничего не может.
Каким образом получить/выделить все геометрические объекты вида (отрезки, окружности, сплайны, кривые и т.п.)?
Находил в SDK экспортную функцию IsGeomObject (obj) - проверить геометрический объект или нет.
Я не знаком с алгоритмом работы с экспортными функциями,и не уверен, подходит ли она вообще для решения этой задачи.
Пока я нашел такое решение:
# создаю временную группу для сбора нужных объектов
TempGroup = iDocument2D.ksNewGroup( 1 )
# создаю список типов нужных объектов
Geometry = [13025, 13072, 13075, 13079, 13083, 13085, 13087, 13093, 13095, 13097, 13099, 13101, 13115, 13151]
# получаю все объекты вида
Objects = iDrawingContainer.Objects( 0 )
# перебираю все объекты
for obj in Objects:
# если типа объекта нет в списке
if not obj.Type in Geometry :
# удаляю его
iDocument2D.ksDeleteObj (obj.Reference)
# иначе
else:
# добавляю объект во временную группу
add = iDocument2D.ksAddObjGroup( TempGroup, obj.Reference )
Но, как оказалось, не у всех объектов можно получить их тип (обозначение позиции, например).
В общем, мне этот путь совсем не нравится и предполагаю, что есть проще способ.
Можно же на чертеже выделять объекты по стилю линии. Я мог бы вызвать эту команду, но как программно реализовать выбор всех стилей линий во всплывающем окне, я не знаю.
Просто есть ещё контейнер условных обозначений - ISymbols2DContainer.
Цитата: Sabahs от 04.04.17, 10:37:00
Просто есть ещё контейнер условных обозначений - ISymbols2DContainer.
Не знал. Интерфейс ISymbols2DContainer я получил. Как мне теперь разом опустошить весь этот контейнер?
Или придется получать интерфейсы коллекций всех возможных объектов, проверять количество элементов в коллекции и при наличии удалять поштучно?
Проще всё выделить и получить полный массив объектов от ISelectionManager.SelectedObjects, а затем его фильтровать.
Цитата: Sabahs от 04.04.17, 11:10:28
Проще всё выделить и получить полный массив объектов от ISelectionManager.SelectedObjects, а затем его фильтровать.
Я поступил иначе. В имеющийся код добавил перехват исключений, что позволило пропускать объекты с неопределившимся типом.
for obj in Objects:
try:
# если типа объекта нет в списке
if not obj.Type in Geometry :
# удаляю его
iDocument2D.ksDeleteObj (obj.Reference)
# иначе
else:
# добавляю объект во временную группу
add = iDocument2D.ksAddObjGroup( TempGroup, obj.Reference )
except:
Не знаю насколько это верно, но работает.
Попробую переделать с Objects = iDrawingContainer.Objects ( 0 ) на
Objects = iSelectionManager.SelectedObjects
чтобы не фильтровать лишние интерфейсы.
Цитата: Sabahs от 04.04.17, 11:10:28
Проще всё выделить и получить полный массив объектов от ISelectionManager.SelectedObjects, а затем его фильтровать.
Поковырял я SelectionManager. В выделение так же попадают объекты с интерфейсом ILeader, IPositionLeader и их собратья, которые категорически не выдают своего Type и Reference, в следствие чего, удалить я их через iDocument2D.ksDeleteObj (obj.Reference) не могу.
Куда они делись?
Просто объекты нужно привести к типу IDrawingObject, т.к. ISelectionManager.SelectedObjects возвращает массив выделенных объектов в виде SAFEARRAY | VT_DISPATCH.
Цитата: Sabahs от 04.04.17, 16:05:22
Куда они делись?
Просто объекты нужно привести к типу IDrawingObject, т.к. ISelectionManager.SelectedObjects возвращает массив выделенных объектов в виде SAFEARRAY | VT_DISPATCH.
Спасибо! Получилось, сам толком не въехал как, но работает. Мозги уже плавятся после тяжёлого дня.
В модели пытаюсь получить внешние информационные переменные, но не могу их программно отделить от не информационных.
Кусок кода:
VariableCollection = iPart.VariableCollection()
iPart.RebuildModel()
VariableCollection.refresh()
for i in range(VariableCollection.GetCount()):
iVariable = VariableCollection.GetByIndex (i)
Information = iVariable.Information
Значение Information для всех внешних переменных False, хотя среди них есть и информационные.
Что я делаю не так?
Для чего?
iPart.RebuildModel()
VariableCollection.refresh()
Цитата: Sabahs от 20.04.17, 09:31:48
Для чего?
iPart.RebuildModel()
VariableCollection.refresh()
На случай, если модель требует перестроения.
Для начала проверить, что переменная возвращает, т.к. она не является булевой.
Цитата: Sabahs от 20.04.17, 11:36:43
Для начала проверить, что переменная возвращает, т.к. она не является булевой.
Питон говорит, что она булева.
Прикрепите макрос, модель и таблицу переменных.
Цитата: Sabahs от 20.04.17, 15:10:50
Прикрепите макрос, модель и таблицу переменных.
Вот макрос и тестовая модель. Переменные в модели.
Попробовал на Delphi через API5, результат тот же, завтра попробую иначе, хотя это уже ошибка.
Попробовал иначе, результат неизменен. Свойство программно устанавливается, только от таблицы живёт отдельно.
PS. В СТП написал, посмотрим, что ответят, запрос SD#795404.
Цитата: Sabahs от 21.04.17, 08:49:09
Свойство программно устанавливается, только от таблицы живёт отдельно.
Я тоже пробовал. И устанавливается и снимается без проблем, но не отображается в окне переменных. Подозрительно ещё то, что можно снять информационность у любой переменной, хотя если переменная зависима от другой она не может быть неинформационной (при работе с переменными стандартным способом свойство информационности таких переменных неактивно).
Подождем ответа СТП.
Вот ещё вопрос. Открываем программно эскиз с уже начерченными там двумя макроэлементами 1 и 2.
Производим некий расчёт радиуса R и строим, например окружность 3
ksDocument2D.ksCircle 0, 0, R, 1 'Наружный диаметр
Далее необходимо передвинуть макроэлемент 1 по X на -12мм и Yпо на -50мм, а макроэлемент 2 по X на +21мм и поjY на -50мм,
чтобы получилась картинка, как внизу.
Вот и вопрос: как программно двигать готовые макроэлементы?
Ошибку по запросу SD#795404 исправили, исправление войдёт в Компас-3D v17.1.
Цитата: Николай от 21.04.17, 12:07:33
Вот ещё вопрос. Открываем программно эскиз с уже начерченными там двумя макроэлементами 1 и 2.
Производим некий расчёт радиуса R и строим, например окружность 3
ksDocument2D.ksCircle 0, 0, R, 1 'Наружный диаметр
Далее необходимо передвинуть макроэлемент 1 по X на -12мм и Yпо на -50мм, а макроэлемент 2 по X на +21мм и поjY на -50мм,
чтобы получилась картинка, как внизу.
Вот и вопрос: как программно двигать готовые макроэлементы?
Может новую тему создать, а эту закрыть, т.к. тут куча вопросов и попробуйте в ней найти ответ на нужный.
IMacroObject.SetPlacement
Цитата: Sabahs от 21.04.17, 12:12:57
Может новую тему создать, а эту закрыть, т.к. тут куча вопросов и попробуйте в ней найти ответ на нужный.
Ответы на вопросы всё равно через строку поиска ищутся, а поиску всё равно отдельная это ветка или нет.
Темы с одним-двумя ответами больше захламляют. Лучше подразделы ввести, наверное.
Возвращаясь к предыдущей проблеме с переменными: в соседней теме http://forum.ascon.ru/index.php/topic,30188.0.html (http://forum.ascon.ru/index.php/topic,30188.0.html) с комментариями к переменным была аналогичная проблема.
Ответ СТП по прошлой проблеме был такой:"Нужно использовать функцию ksPart::GetFeature().VariableCollection.
Функция ksPart::VariableCollection предназначена только для изменения значений внешних переменных."
Но даже этот вариант не работал с ksVariable.Information, тут всё работает, можете убедится ответ на картинке, изменения отображаются в таблице после RebuildDocument.
Цитата: Николай от 21.04.17, 12:07:33
Вот ещё вопрос. Открываем программно эскиз с уже начерченными там двумя макроэлементами 1 и 2.
Производим некий расчёт радиуса R и строим, например окружность 3
ksDocument2D.ksCircle 0, 0, R, 1 'Наружный диаметр
Далее необходимо передвинуть макроэлемент 1 по X на -12мм и Yпо на -50мм, а макроэлемент 2 по X на +21мм и поjY на -50мм,
чтобы получилась картинка, как внизу.
Вот и вопрос: как программно двигать готовые макроэлементы?
Вашу задачу со штангенциркулем возможно реализовать и без применения программирования.
Файл приложен.
А можно сохранить в 5 версии? Имеем официально 9, но даже в 14 не открывается, А Вьювер воспроизводит неподвижную картинку... ::)
Цитата: Николай от 25.04.17, 08:35:22
А можно сохранить в 5 версии? Имеем официально 9, но даже в 14 не открывается, А Вьювер воспроизводит неподвижную картинку... ::)
Попробуйте, сохранил в 14.2. При сохранении в 5ю версию перестает работать.
Описание: в файле основного фрагмента создаемлокальный фрагмент_1 и фрагмент_2, где начало координат каждого привязываем к размерным параметрам центра окружности. И с помощью переменных можем двигать фрагмент. Фрагмент в нашем случае аналогичен макро-элементу.
Хотя в версии 14.00 и не открылось, но, благодаря видео, принцип стал понятен, спасибо. А в качестве бонуса прикладываю чертёж этого штангенциркуля- может пригодиться. :)
Как при сохранении фрагмента в формат *.dxf установить версию Автокада 2000.
iDocument2D.ksSaveToDXF (PathName) не даёт выбора версии.
Полагаю, что надо через конвертер сохранять и настраивать ConverterParameters( long command), но где получить информацию от этих параметрах?
Только сохранением через конвертер, установить через визуальный диалог или разбираться с командами конвертера.
Не могу докопаться до переменных через интерфейс iKompasDocument2D1.
iApplication = Dispatch('KOMPAS.Application.7')
iApplication = KAPI7.IApplication(iApplication)
iDocument = iApplication.ActiveDocument
iKompasDocument2D = KAPI7.IKompasDocument2D(iDocument)
iKompasDocument2D1 = KAPI7.IKompasDocument2D1(iKompasDocument2D)
print "1: ", iKompasDocument2D1
print "2: ", iKompasDocument2D1.Variables
print "3: ", iKompasDocument2D1.VariablesCount
Результат:
1: <Kompas10API7.IKompasDocument2D1 instance at 0x111656632>
2: <bound method IKompasDocument2D1.Variables of <Kompas10API7.IKompasDocument2D1 instance at 0x111656632>>
3: <bound method IKompasDocument2D1.VariablesCount of <Kompas10API7.IKompasDocument2D1 instance at 0x111656632>>
Не знаю какие переменные видит iKompasDocument2D1, но мне нужен доступ к пользовательским переменные 2D документа.
IView.Variables дал мне доступ к системным переменным, но пользовательские он не видит.
Вы его получили?
pKompasDocument2D1 := pKompasDocument2D as iKompasDocument2D1;
Цитата: pr0100 от 25.04.17, 10:00:07
Попробуйте, сохранил в 14.2. При сохранении в 5ю версию перестает работать.
Описание: в файле основного фрагмента создаемлокальный фрагмент_1 и фрагмент_2, где начало координат каждого привязываем к размерным параметрам центра окружности. И с помощью переменных можем двигать фрагмент. Фрагмент в нашем случае аналогичен макро-элементу.
Как Вам удалось наложить зависимости на геометрию фрагмента? Можно поподробнее рассказать?
Мне не удается повторить. :(
О! Похоже фрагменты позволят привязаться только к началу координат фрагмента. Я правильно понял?
Цитата: Sabahs от 17.05.17, 13:03:44
Вы его получили?
pKompasDocument2D1 := pKompasDocument2D as iKompasDocument2D1;
Судя по записи "1: <Kompas10API7.IKompasDocument2D1 instance at 0x111656632>" наверное получил.
А вот из него ничего не получить. Может его к какому-то ещё интерфейсу привести надо?
И равен нулю.
Откройте SDK и посмотрите, что iKompasDocument2D1 получают от iKompasDocument2D.
Цитата: Sabahs от 17.05.17, 13:23:45
Откройте SDK и посмотрите, что iKompasDocument2D1 получают от iKompasDocument2D.
Я так и получаю.
Для проверки работоспособности интерфейса решил проверить дочерний интерфейс ISelectionManager.
iApplication = KAPI7.IApplication(iApplication)
iDocument = iApplication.ActiveDocument
iKompasDocument2D = KAPI7.IKompasDocument2D(iDocument)
iKompasDocument2D1 = KAPI7.IKompasDocument2D1(iKompasDocument2D)
SelectionManager = iKompasDocument2D1.SelectionManager
SelectionManager.UnselectAll()
iKompasDocument2D1.RebuildDocument()
Код работает, выделение с объектов снимается.
Напал на след!
Оказывается методу VariablesCount() нужен аргумент 0/1 (False/True), чтобы он показал кол-во либо всех пользовательских переменных, либо кол-во только внешних переменных. В справке нет про это ни слова.
VariablesCount = iKompasDocument2D1.VariablesCount(0)
Для Variables() также нужен аргумент.
1 (True) - формирует список ссылок на интерфейсы всех внешних переменных, если переменная одна, то вместо ссылки на интерфейс выдается значение этой переменной.
0 (False) - формирует список ссылок на интерфейсы всех переменных у которых не пустая ячейка в столбце "Выражение", если переменная одна, то вместо ссылки на интерфейс выдается значение этой переменной, если у неё не пустая ячейка в столбце "Выражение".
Цитата: IgorT от 17.05.17, 13:14:59
О! Похоже фрагменты позволят привязаться только к началу координат фрагмента. Я правильно понял?
Да верно, от сюда и плясать со всей параметризацией.
:(
А в К-17 случайно не добавили возможность цепляться за любую геометрию макроэлементов/фрагментов в целях параметризации?
Как на Python получить интерфейс IKompasDocument3D1?
Коллеги, прошу сильно не пинать, если написал не туда. Не могу понять, как программно нарисовать отрезок в 3D с координатами относительно текущей ЛСК. Хоть и выставлена ЛСК текущей, но в результате отрезок создается относительно Начала координат
Segment_3D->BuildingType = ksLineSegment3DTypeEnum::ksLSTTwoPoints;
Segment_3D->SetPoint (TRUE, X1, Y1, Z1);
Segment_3D->SetPoint (FALSE, X2, Y2, Z2);
Необходимо установить свойство IKompasDocument3D.CreateObjectsInCurrentLocalCS.
Doc3D.CreateObjectsInCurrentLocalCS:=True;
Пробовал поэкспериментировать с ЛСК. ЛСК создаётся, назначается текущей.
Но, при создании отрезка, координаты его концов, которые я забиваю соответствуют координатам глобальной СК.
Хотя, в переменных для отрезка прописываются локальные координаты.
Отсюда вопрос: что дописать в код, чтобы при создании отрезка можно было вводить координаты соответствующие ЛСК?
# -*- coding: cp1251 -*-
import Kompas10API5 as KAPI
import Kompas10API7 as KAPI7
from win32com.client import Dispatch
import LDefin3D
import ksConstants3D as CONST3D7
iKompasObject = Dispatch('KOMPAS.Application.5')
iKompasObject = KAPI.KompasObject(iKompasObject)
iApplication = Dispatch('KOMPAS.Application.7')
iApplication = KAPI7.IApplication(iApplication)
##iSystemSettings = iApplication.SystemSettings
##iSystemSettings.ModelLocalCSSetActive = True
##iSystemSettings.ModelLocalCSCreateInAbsoluteCS = True
iDocument3D = iKompasObject.ActiveDocument3D()
iDocument = iApplication.ActiveDocument
iKompasDocument3D = KAPI7.IKompasDocument3D(iDocument)
iPart7 = iKompasDocument3D.TopPart
iPart = iDocument3D.GetPart(LDefin3D.pTop_Part)
# Создаём ЛСК
iAuxiliaryGeomContainer = KAPI7.IAuxiliaryGeomContainer(iAuxiliaryGeomContainer)
iLocalCoordinateSystems = iAuxiliaryGeomContainer.LocalCoordinateSystems
iLocalCoordinateSystem = iLocalCoordinateSystems.Add()
iLocalCoordinateSystem.OrientationType = CONST3D7.constants.ksAxisOrientation
iLocalCSParameters = iLocalCoordinateSystem.LocalCSParameters
iLocalCSAxesDirectionParam = KAPI7.ILocalCSAxesDirectionParam(iLocalCSAxesDirectionParam)
matrix = [0.146447, 0.853553, 0.5, 0, -0.853553, -0.146447, 0.5, 0, 0.5, -0.5, 0.707107, 0, 10, 10, 10, 1]
iLocalCoordinateSystem.InitByMatrix3D(matrix)
iLocalCoordinateSystem.Update()
# Создавать новые объекты в ЛСК
iKompasDocument3D.CreateObjectsInCurrentLocalCS=True
# Создаём отрезок по двум точкам
iLineSegments3D = iAuxiliaryGeomContainer.LineSegments3D
iLineSegment3D = iLineSegments3D.Add()
iLineSegment3D.BuildingType = CONST3D7.constants.ksLSTTwoPoints
# Координаты начала в глобальной СК
iLineSegment3D.SetPoint(True, 0, 0, 0)
# Координаты конца в глобальной СК
iLineSegment3D.SetPoint(False, 50, 0, 0)
iLineSegment3D.Update()
Цитата: ТрындецЪ от 04.07.17, 16:17:11
Пробовал поэкспериментировать с ЛСК. ЛСК создаётся, назначается текущей.
Но, при создании отрезка, координаты его концов, которые я забиваю соответствуют координатам глобальной СК.
Да, точно. Подтверждаю. Координаты при создании пересчитываются относительно глобальной СК.
Цитата: ТрындецЪ от 04.07.17, 16:17:11
Хотя, в переменных для отрезка прописываются локальные координаты.
А в переменных у меня тоже пересчитанные относительно глобальной...
Надо пересчитывать.
Цитата: Slaviation от 03.12.15, 13:16:11
Если процесс размещения компонента предполагалось дать пользователю, то:
Правильнее было бы дать пользователю соответствующую компасовую панель, со всеми возможностями размещения.
Сделать это можно запустив процесс KompasObject::ksExecuteKompasCommand(prAddPartFromFile, True).
После запуска этому процессу понадобится файл для вставки и процесс создаст событие BeginRequestFiles (на него надо будет предварительно подписаться).
В обработчике этого события подсовываем свой файл.
Имеем интерактивный процесс размещения компонента со всеми "наворотами".
Как на питоне подписаться на событие "BeginRequestFiles" и запустить процесс "ksExecuteKompasCommand"?
Помогите пожалуйста: как получить в Питоне значения размерных переменных? Я инженер, что касается черчения - справляюсь, но вынужден пробовать писать скрипт на Питоне (Компас-Макро), а в программировании дуб дубом, даже азы :`(
И вообще не пойму (SDK уже до дыр прочел) как можно получить идентификаторы всех объектов чертежа?
Например, в виде множества, словаря и т. п. ... Пока с трудом представляю себе объектную модель документа Компас.
Цель -- считать значения свойств отрезка (длины, координат концов и т. д.), который уже есть на плоском чертеже (.frw), и присвоить их значения переменным Питона для дальнейшего использования. Может пример готовый есть? 8-)
# (Python)(2020 год) Перебор (Итератор) всех отрезков и получение их координат , через API5
# Получим активный документ
kompas_document = application.ActiveDocument
kompas_document_2d = kompas_api7_module.IKompasDocument2D(kompas_document)
iDocument2D = kompas_object.ActiveDocument2D()
# Итератор, перебор существующих отрезков:
iIterator = kompas_object.GetIterator()
iIterator.ksCreateIterator( 1, 0 ) # - Cоздать итератор для перемещения по объектам документа.(0-все объекты 1-отрезки и т.д. смотреть SDK) tipSearch - тип объекта(очень много),parent - указатель на объект (для движения по группе, внутри макроэлемента, по слою).
obj = iIterator.ksMoveIterator( "F" ) # - Переместить итератор (позиционироваться на объекте) F - первый объект,N - следующий объект
CHislo_otrezkov=0
if iDocument2D.ksExistObj(obj): # Если объекты существуют, то тогда делать цикл
while iDocument2D.ksExistObj(obj) != 0: # ksExistObj - Проверить существование объекта. Возвращаемое значение:(1 - в случае наличия объекта)(0 - в случае отсутствия объекта)
CHislo_otrezkov = CHislo_otrezkov+1
LineN = kompas6_api5_module.ksLineSegParam(kompas_object.GetParamStruct(kompas6_constants.ko_LineSegParam))
LineN.Init()
LineN.x1 # Координата Х1 отрезка
LineN.y1 # Координата Y1 отрезка
LineN.x2 # Координата X2 отрезка
LineN.y2 # Координата Y2 отрезка
print ("Координаты отрезка №",LineN," Х1,Y1,X2,Y2 = ",LineN.x1,',',LineN.y1,',',LineN.x2,',',LineN.y2)
obj = iIterator.ksMoveIterator( "N" ) # - Переместить итератор (позиционироваться на объекте) F - первый объект,N - следующий объект
iIterator.ksDeleteIterator() # ksDeleteIterator - Удалить блок параметров навигации по модели
print('Количество отрезков в чертеже= ',CHislo_otrezkov)
# -*- coding: utf-8 -*-
import pythoncom
from win32com.client import Dispatch, gencache
import LDefin2D
import MiscellaneousHelpers as MH
# Подключим константы API Компас
kompas6_constants = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants
kompas6_constants_3d = gencache.EnsureModule("{2CAF168C-7961-4B90-9DA2-701419BEEFE3}", 0, 1, 0).constants
# Подключим описание интерфейсов API5
kompas6_api5_module = gencache.EnsureModule("{0422828C-F174-495E-AC5D-D31014DBBE87}", 0, 1, 0)
kompas_object = kompas6_api5_module.KompasObject(Dispatch("Kompas.Application.5")._oleobj_.QueryInterface(kompas6_api5_module.KompasObject.CLSID, pythoncom.IID_IDispatch))
MH.iKompasObject = kompas_object
# Подключим описание интерфейсов API7
kompas_api7_module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
application = kompas_api7_module.IApplication(Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(kompas_api7_module.IApplication.CLSID, pythoncom.IID_IDispatch))
MH.iApplication = application
Documents = application.Documents
# Получим активный документ
kompas_document = application.ActiveDocument
kompas_document_2d = kompas_api7_module.IKompasDocument2D(kompas_document)
iDocument2D = kompas_object.ActiveDocument2D()
iDrawingDocument = kompas_document._oleobj_.QueryInterface(kompas_api7_module.IDrawingDocument.CLSID, pythoncom.IID_IDispatch)
iDrawingDocument = kompas_api7_module.IDrawingDocument(iDrawingDocument)
iTechnicalDemand=iDrawingDocument.TechnicalDemand
iTechnicalDemand.AutoPlacement = False
iTechnicalDemand.BlocksGabarits = (25.0, 65.0, 200.0, 263.0)
iTechnicalDemand.Update()
Скрипт размещения техтребований над основной надписью (питон 2). Нужно прописать зависимость от формата чертежа