Как получить список объектов описывающую границу штриховки ?

Автор Doom, 22.08.23, 14:02:09

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

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

Doom

Добрый день,

В хелпе ищу способы получить этот список через IBoundariesObject::Boundaries и IDrawingContour
Но не пойму как найти все объекты описывающую границу штриховки?

HatchS_ = drawing_container.Objects(const_2d_.ksDrHatch)
for iobject in HatchS_:
    h = KAPI7.IBoundariesObject(iobject)
    b = h.Boundaries
    d = KAPI7.IDrawingContour(b)

Нужно получить все эти линии.


Doom

Обнаружил что координаты базовой точки штриховки - это координаты вставки ? Почему то они всегда равны 0

IHatch:
X - Координата базовой точки штриховки по оси X
Y - Координата базовой точки штриховки по оси Y

Было бы удобно конечно если это координаты вставки тогда это упростило бы часть задач.

Doom

IDrawingContour::IContour::Count
IDrawingContour::IContour::Segment::IContourSegment::ksContourSegmentEnum

ksCSUnknown -1 Неизвестный объект
ksCSLineSeg 1 Отрезок
ksCSCircle 2, Окружность
ksCSArc 3 Дуга
ksCSBezier 8 Bezier сплайн
ksCSEllipse 32 Эллипс
ksCSNurbs 33 Nurbs сплайн
ksCSEllipseArc 34 Дуга эллипса

вроде как не все объекты которые могут быть..

Я так понимаю это геометрия границ а не объектов которые создали контур ?


Doom

Застрял вот на этих объектах.

# -*- coding: utf-8 -*-
"""
Created on Tue Aug 22 19:18:58 2023

@author: ZeroHour
"""

from win32com.client import Dispatch, gencache

# -----------------------------------------------------------------------------
# Компас v16
# -----------------------------------------------------------------------------

from ksConstV16 import constants as const_2d_
from ksConst3DV16 import constants as const_3d_

import LDefin2D
import LDefin3D

import KompasApi5V16 as KAPI5
import KompasApi7V16 as KAPI7

api5_ = Dispatch('Kompas.Application.5', None, KAPI5.KompasObject.CLSID)
api7_ = Dispatch('Kompas.Application.7')

uDoc7 = api7_.ActiveDocument
DocType = api5_.ksGetDocumentType(0) # если 0 - то указатель на активный документ

if DocType == LDefin2D.lt_DocSheetStandart or DocType == LDefin2D.lt_DocSheetUser:
    Doc2D7 = KAPI7.IKompasDocument2D(uDoc7)
    Doc2D5 = api5_.ActiveDocument2D()
    Doc2D5 = KAPI5.ksDocument2D(Doc2D5)
   
    viewsAndLayersManager = Doc2D7.ViewsAndLayersManager

    views = viewsAndLayersManager.Views
    views = KAPI7.IViews(views)
   
    view_item = views.ActiveView
    view_item = KAPI7.IView(view_item)
   
    print(view_item.Name)
   
    drawing_container = KAPI7.IDrawingContainer(view_item)
   
    HatchS_ = drawing_container.Objects(const_2d_.ksDrHatch)
   
    for iobject in HatchS_:
       
        hatch_ = KAPI7.IHatchParam(iobject)
        print(hatch_.HatchAngle)
       
        bundsObj = KAPI7.IBoundariesObject(iobject)
        bunds = bundsObj.Boundaries[0]
        contour_ = KAPI7.IContour(bunds)
        print(contour_.Count)
       
        for i in range(contour_.Count):
           
            segment_ = contour_.Segment(i)
            сonsegment = KAPI7.IContourSegment(segment_)
            ment_type = сonsegment.SegmentType
           
            print(ment_type)
           
            if ment_type == const_2d_.ksCSLineSeg:
                # Отрезок
                iline_ = KAPI7.IContourLineSegment(сonsegment)
               
            elif ment_type == const_2d_.ksCSCircle:
                # Окружность
                iarc_ = KAPI7.IContourArc(сonsegment)
            elif ment_type == const_2d_.ksCSArc:
                # Дуга
                pass
            elif ment_type == const_2d_.ksCSBezier:
                # Bezier сплайн
                pass
            elif ment_type == const_2d_.ksCSEllipse:
                # Эллипс
                pass
            elif ment_type == const_2d_.ksCSNurbs:
                # Nurbs сплайн
                pass
            elif ment_type == const_2d_.ksCSEllipseArc:
                # Дуга эллипса
                pass
            else:
                input('error: что то пошло не так.. тип объекта:', ment_type)

       



есть IContourLineSegment и IContourArc, а для остальных объектов что подставлять?

Для const_2d_.ksCSLineSeg --> IContourLineSegment
для const_2d_.ksCSCircle --> IContourArc
для const_2d_.ksCSArc --> тут через что получить контур ?
для const_2d_.ksCSBezier --> тут через что получить контур ?

Scull_

Если смотреть границы то нужно смотреть DrawingObjectTypeEnum - Типы графических объектов, но их нужно фильтровать, не все могут быть границами.
SDK_21.png
+ Благодарностей: 1

Doom

Спасибо!

Есть необходимость получить координаты середины кривой(отрезок, дуга, кривая и тд)

нашел IContourSegment  > ICurve2D > CalculatePolygonByStep(Length/2) - все ли объекты он так сможет перебрать?

Doom

В хелпе указано что ICurve2D могу получить с IContourSegment, но не выходит - ошибка

for i in range(contour_.Count):
           
            segment_ = contour_.Segment(i)
            сonsegment = KAPI7.IContourSegment(segment_)
            ment_type = сonsegment.SegmentType
           
            # iDObject = KAPI7.IDrawingObjects(segment_)
            # iDObject1 = KAPI7.IDrawingObject1(iDObject)
           
            # iCurve2D = iDObject1.GetCurve2D()
            # Length = iCurve2D.Length
           
            ic_ = KAPI7.ICurve2D(сonsegment)
            # ic_ = KAPI7.Curve2D(сonsegment)
            print(ic_.Length)

не так вот
segment_ = contour_.Segment(i)
сonsegment = KAPI7.IContourSegment(segment_)
icurve2d_ = сonsegment.Curve2D
icurve2d_ = KAPI7.ICurve2D(icurve2d_)
print(icurve2d_.Length)

Doom

Как мне проще получить координаты центра сегмента контура ?

Смысла в этом нет тк сегмент может быть меньше 1 мм длины и в итоге могут быть ошибки
Тогда как получить список опорных точек ?

Делаю так:
if ment_type == const_2d_.ksDrLineSeg:
    # Отрезок
    iline_ = KAPI7.ILineSegment(segment_)
    print(iline_.Length)
   
elif ment_type == const_2d_.ksDrCircle:
      # Окружность
    icircle_ = KAPI7.ICircle(segment_)
    print(icircle_.Radius)
   
elif ment_type == const_2d_.ksDrArc:
    # Дуга
    iarc_ = KAPI7.IArc(segment_)
    print(iarc_.Direction)
   
elif ment_type == const_2d_.ksDrBezier:
    # Bezier сплайн
    ibezier_ = KAPI7.IBezier(segment_)
    print(ibezier_.Closed)
   
elif ment_type == const_2d_.ksDrEllipse:
    # Эллипс
    iellipse_ = KAPI7.IEllipse(segment_)
    print(iellipse_.Closed)
   
elif ment_type == const_2d_.ksDrNurbs:
    # Nurbs сплайн
    inurbs_ = KAPI7.INurbs(segment_)
    print(inurbs_.GetNurbsParams)

elif ment_type == const_2d_.ksDrEllipseArc:
    # Дуга эллипса
    iellipsearc_ = KAPI7.IEllipseArc(segment_)
    print(iellipsearc_.Direction)

Наверно есть проще вариант ?

Scull_

Проще вариантов искать не стоит и так куда еще проще?
ObjectsDlina.png
Штрих.png
Штрих_1.png

Doom

Я так и понял что нужно все сегменты свести к геометрии и с ними работать..

Вы можете скинуть на почту все эти файлы ?  :angel:



Doom

"...На почту хожу письма ношу..." :)
Не жмитесь - ради науки живем -> izhgtumekhanik@gmail.com

может даже потом это Вам вернется многократно!

Scull_

Не люблю научных сотрудников, особенно когда они файлы, от функций и процедур не могут отличить.
PS. Не обижайтесь.

Doom

Цитата: Scull_ от 23.08.23, 12:26:34Не люблю научных сотрудников.
PS. Не обижайтесь.

вот с этого и началась войнушка - ирония судьбы или с легким шоком? :)

Я понял что только научное просвещение исправит страну!


Doom

Я уже завел привычку - сам все документировать ибо не все хелпы хорошо расписаны.

Scull_


Doom

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

Самое неудобное это поиск по части от имени - например я искал ksHatchParam по слову Hatch и ksHatchParam  не высвечивается в результатах поиска и так почти всегда.

Там не указано что сегменты можно свести к геометрии примитивов и так работать с ними - только методом тыка проб и ошибок и логики пришел к этому.
Цитата: Scull_ от 22.08.23, 20:40:57Если смотреть границы то нужно смотреть DrawingObjectTypeEnum

Doom

Готово, НО с некоторыми допущениями: граница не является окружностью/эллипсом.

from win32com.client import Dispatch, gencache

# -----------------------------------------------------------------------------
# Компас v16
# -----------------------------------------------------------------------------

from ksConstV16 import constants as const_2d_
from ksConst3DV16 import constants as const_3d_

import LDefin2D
import LDefin3D

import KompasApi5V16 as KAPI5
import KompasApi7V16 as KAPI7

api5_ = Dispatch('Kompas.Application.5', None, KAPI5.KompasObject.CLSID)
api7_ = Dispatch('Kompas.Application.7')

uDoc7 = api7_.ActiveDocument
DocType = api5_.ksGetDocumentType(0) # если 0 - то указатель на активный документ

if DocType == LDefin2D.lt_DocSheetStandart or DocType == LDefin2D.lt_DocSheetUser:
    Doc2D7 = KAPI7.IKompasDocument2D(uDoc7)
    Doc2D17 = KAPI7.IKompasDocument2D1(Doc2D7)
    Doc2D5 = api5_.ActiveDocument2D()
    Doc2D5 = KAPI5.ksDocument2D(Doc2D5)
   
    viewsAndLayersManager = Doc2D7.ViewsAndLayersManager

    views = viewsAndLayersManager.Views
    views = KAPI7.IViews(views)
   
    view_item = views.ActiveView
    view_item = KAPI7.IView(view_item)
   
    print(view_item.Name)
   
    drawing_container = KAPI7.IDrawingContainer(view_item)
   
    HatchS_ = drawing_container.Objects(const_2d_.ksDrHatch)
   
    iSelectionManager = Doc2D17.SelectionManager
   
    AllHatchObj = []
   
    for iobject in HatchS_:
       
        currentHatchObj = []
       
        hatch_ = KAPI7.IHatchParam(iobject)
       
        bundsObj = KAPI7.IBoundariesObject(iobject)
        bunds = bundsObj.Boundaries[0]
        contour_ = KAPI7.IContour(bunds)

        for i in range(contour_.Count):
           
            segment_ = contour_.Segment(i)
            сonsegment = KAPI7.IContourSegment(segment_)
            ment_type = сonsegment.SegmentType
           
            # ---------------------------------------------

            icurve2d_ = сonsegment.Curve2D
            icurve2d_ = KAPI7.ICurve2D(icurve2d_)

            sarr_ = icurve2d_.CalculatePolygonByStep(icurve2d_.Length)
           
            # координты начальной точки линии/кривой
            point1_X = sarr_[0]
            point1_Y = sarr_[1]
           
            endindex = len(sarr_) - 1
           
            # координты конечной точки линии/кривой
            point2_X = sarr_[endindex-1]
            point2_Y = sarr_[endindex]
                       
            # фильтруем дубликаты
            cp = {'X':point1_X, 'Y':point1_Y}
            cp_ = {'X':point2_X, 'Y':point2_Y}

            if cp not in currentHatchObj:
                currentHatchObj.append(cp)
           
            if cp_ not in currentHatchObj:
                currentHatchObj.append(cp_)
       
        TempGroup = Doc2D5.ksNewGroup(1)
        Doc2D5.ksEndGroup()
       
        if currentHatchObj:
            for ch_ in currentHatchObj:
                # Doc2D5.ksPoint(ch_['X'], ch_['Y'], 0)
                objs = Doc2D5.ksSelectGroup(g=TempGroup, selectMode=3, xmin=ch_['X']-1, ymin=ch_['Y']-1, xmax=ch_['X']+1, ymax=ch_['Y']+1)
       
       
        iIterator = api5_.GetIterator()
       
        objTypeConst = LDefin2D.ALL_OBJ
               
        iIterator.ksCreateIterator(objTypeConst, TempGroup)
       
        next_object = iIterator.ksMoveIterator("F")
       
        while Doc2D5.ksExistObj(next_object) == 1:
            type_obj = Doc2D5.ksGetObjParam(next_object, None, LDefin2D.ALLPARAM)                       
           
            next_object = api5_.TransferReference(next_object, Doc2D5.reference)
           
            if type_obj != LDefin2D.HATCH_OBJ:
                iSelectionManager.Select(next_object)
                #print(next_object)
           
            next_object = iIterator.ksMoveIterator("N")
       
        iIterator.ksDeleteIterator()