Пазы и оси

Автор Vitalij Lysanov, 04.11.16, 21:20:57

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

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

Vitalij Lysanov

Программа строит оси пазов с использованием библиотеки Pik10.

Все дуги записываются в массив.
Массив фильтруется на одинаковые радиусы и одинаковые центры дуг.
И в этих точках строятся оси.


Часть программы, определяющая координаты дуг приведена в примерах к библиотеке Pik10.
Осталось только отсортировать массив  и нарисовать оси.

Наклон осей можно менять, т.к. углы каждой дуги также записываются в массив.

Программой можно проверить алгоритм выделения пазов из чертежа.


Если исключить библиотеку Pik10, возможности по удобству запуска программы расширятся.

Из общего:
                 Сама программа, это несколько строчек.
                 Частные случаи, при наличии графического интерфейса, могут программироваться перемещением кубиков и стрелок между кубиками.  Например как в MatLab и других программах.


# coding: cp1251
# 2D-API|step7

import math
import time
import cmath
import Kompas6API5, LDefin2D
Kompas, doc2d = start2d()

count = 0
iIter = Kompas6API5.ksIterator(Kompas.GetIterator())     # ksIterator
iIter.ksCreateIterator(LDefin2D.ARC_OBJ, 0)


r=[]
xc=[]
yc=[]

xyk=[]

ang1=[]
ang2=[]


if iIter.reference:
    obj = iIter.ksMoveIterator("F")
    if doc2d.ksExistObj(obj):
        while doc2d.ksExistObj(obj) <> 0:
            par  = Kompas6API5.ksArcByAngleParam(Kompas.GetParamStruct( LDefin2D.ko_ArcByAngleParam ))  # Структура параметров дуги окружности по центру, радиусу и углам
            t = doc2d.ksGetObjParam( obj, par, LDefin2D.ALLPARAM )   # Получить параметры отрезка
            if t==3:
#                print t,"dug   tochka   xc   yc= ",par.xc,par.yc,"  r=",par.rad,  "u   =" , par.ang1, par.ang2

                r.append(par.rad)

                xc.append(par.xc)
                yc.append(par.yc)
                xyk.append((par.xc)+(par.yc)*1j)

                ang1.append(par.ang1)
                ang2.append(par.ang2)



            obj = iIter.ksMoveIterator("N")


for n1 in range(len(xyk)):
    for n2 in range(len(xyk)):
        if xyk[n1]==xyk[n2]:
            if r[n1]==r[n2]:
                if n1<>n2:

                    x=xyk[n1].real
                    y=xyk[n1].imag
                    rad=r[n1]*1.5
                  #  doc2d.ksPoint (xyk[n1].real, xyk[n1].imag, 0)
                    doc2d.ksLineSeg (x, y, x+rad, y, 3)
                    doc2d.ksLineSeg (x, y, x-rad, y, 3)
                    doc2d.ksLineSeg (x, y, x, y+rad, 3)
                    doc2d.ksLineSeg (x, y, x, y-rad, 3)
   


Vitalij Lysanov


С пазами есть другой вариант.
Тут главное. Обозначить фронт работ.


import autopy

import cmath
import time
import Kompas6API5, LDefin2D
Kompas, doc2d = start2d()

import math


import Kompas6API5 as KAPI
from win32com.client import Dispatch
import LDefin2D
import LDefin3D
import cmath
iKompasObject = Dispatch('KOMPAS.Application.5')
iKompasObject = KAPI.KompasObject(iKompasObject)

iDocument2D = iKompasObject.ActiveDocument2D()

###########################################################

def duga3t(t1s,t13sr,t3s):
    iDocument2D.ksArcBy3Points(t1s.real,t1s.imag,t13sr.real,t13sr.imag,t3s.real,t3s.imag,1)

###########################################################

def duga(dc,r,d1,d2,n):
    iDocument2D.ksArcByPoint(dc.real, dc.imag, r,d1.real, d1.imag,d2.real, d2.imag,  n, 1)

###########################################################

def toch(t1,tip):
    doc2d.ksPoint( t1.real, t1.imag, tip )

# Функция        Отрезок типа
###########################################################

def otr_tip(t1,t2,tip):
    doc2d.ksLineSeg( t1.real, t1.imag, t2.real, t2.imag, tip )

# Функция        Отрезок. Записывает объекты в массив. Возвращает массив.
###########################################################

def otr(t1,t2):
    ob=doc2d.ksLineSeg( t1.real, t1.imag, t2.real, t2.imag, 1)
    lst.append(ob)
    return lst

# Функция        Отрезок.
###########################################################

def otr_ris(t1,t2):
    ob=doc2d.ksLineSeg( t1.real, t1.imag, t2.real, t2.imag, 1)
    #lst.append(ob)
    #return lst

###########################################################



iksIterator = iKompasObject.GetIterator()
if iksIterator.ksCreateIterator(35, 0) == True:
   iObjParam = KAPI.ksRectangleParam(iKompasObject.GetParamStruct(LDefin2D.ko_RectangleParam))
   obj = iksIterator.ksMoveIterator("F")

   while iDocument2D.ksExistObj(obj) == 1:
      iDocument2D.ksGetObjParam(obj, iObjParam, -1)

# Координаты прямоугольников в задании
      x= iObjParam.x
      y= iObjParam.y
      ug=iObjParam.ang
      vi=iObjParam.height
      dl=iObjParam.width

      ug=math.radians(ug)

# Точки прямоугольников
      t1=x+y*1j
      t2=t1+cmath.rect(dl,ug)
      t3=t1+1j*cmath.rect(vi,ug)
      t4=t2+1j*cmath.rect(vi,ug)



# Точки середины боковых отрезков, для дуги
      t13sr=(t1+t3)/2.0
      t24sr=(t2+t4)/2.0

# Точки дуг
      if vi>0:
          t1s=t1+cmath.rect(vi/2.0,ug)
          t3s=t3+cmath.rect(vi/2.0,ug)
          t2s=t2+cmath.rect(vi/2.0,ug+math.pi)
          t4s=t4+cmath.rect(vi/2.0,ug+math.pi)
      else:
          t1s=t1-cmath.rect(vi/2.0,ug)
          t3s=t3-cmath.rect(vi/2.0,ug)
          t2s=t2-cmath.rect(vi/2.0,ug+math.pi)
          t4s=t4-cmath.rect(vi/2.0,ug+math.pi)

# Построение дуг
      duga3t(t1s,t13sr,t3s)
      duga3t(t2s,t24sr,t4s)

# Построение отрезков
      otr_tip(t1s,t2s,1)
      otr_tip(t3s,t4s,1)

# Центр паза
      centr_p=(t1+t2+t3+t4)/4
      toch(centr_p,0)

# Точки для осей
      tos1=centr_p+cmath.rect(1.2*(dl/2.0),ug)
      tos2=centr_p+cmath.rect(1.2*(dl/2.0),ug+math.pi)

# Построение оси
      otr_tip(tos1,tos2,3)

# Точки для осей
      tos3=centr_p+1j*cmath.rect(1.2*(vi/2.0),ug)
      tos4=centr_p+1j*cmath.rect(1.2*(vi/2.0),ug+math.pi)

# Построение оси
      otr_tip(tos3,tos4,3)

# Удаление прямоугольника
      iDocument2D.ksDeleteObj(obj)

      obj = iksIterator.ksMoveIterator("N")


   iksIterator.ksDeleteIterator()