Семейство кривых. Достроить кривые симметрично и объединить для эскиза.

Автор Vitalij Lysanov, 22.10.16, 15:16:51

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

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

Vitalij Lysanov

На фрагменте строим участки кривых, которые нужно достроить симметрично и объединить для эскиза.

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


Программа рассчитана на порядок построения кривых слева направо. 
 
# -*- coding: cp1251 -*-
#|z2

import Kompas10API5 as KAPI
import Kompas10API7 as KAPI7
import pythoncom
from win32com.client import Dispatch
import LDefin2D
import LDefin3D
import ksConstants as CONST2D7
import ksConstants3D as CONST3D7
import MiscellaneousHelpers as MH

iKompasObject = Dispatch('KOMPAS.Application.5')
iKompasObject = KAPI.KompasObject(iKompasObject)
MH.iKompasObject = iKompasObject

iApplication = Dispatch('KOMPAS.Application.7')
iApplication = KAPI7.IApplication(iApplication)
MH.iApplication = iApplication

iDocument2D = iKompasObject.ActiveDocument2D()
iDocument = iApplication.ActiveDocument
iKompasDocument2D = KAPI7.IKompasDocument2D(iDocument)


iDocument2D.ksBezier(0, 1)
iDocument2D.ksPoint(10.29718837272, 25.0, 0)
iDocument2D.ksPoint(16.69798896844, 16.60482615320, 0)
iDocument2D.ksPoint([b]24.47038969183[/b], 16.60482615320, 0)
obj = iDocument2D.ksEndObj()


Здесь кривая из трех точек, Начертим эту кривую и добавим еще две точки, осматривая массив в обратном порядке.

24.47038969183 это точка симметрии.
Две новые точки смещаем вправо на рассчитанное расстояние.

Программа:
# coding: cp1251
#|Задание

import Kompas10API5 as KAPI
import Kompas10API7 as KAPI7
import pythoncom
from win32com.client import Dispatch
import LDefin2D
import LDefin3D
import ksConstants as CONST2D7
import ksConstants3D as CONST3D7
import MiscellaneousHelpers as MH

iKompasObject = Dispatch('KOMPAS.Application.5')
iKompasObject = KAPI.KompasObject(iKompasObject)
MH.iKompasObject = iKompasObject

iApplication = Dispatch('KOMPAS.Application.7')
iApplication = KAPI7.IApplication(iApplication)
MH.iApplication = iApplication

iDocument2D = iKompasObject.ActiveDocument2D()
iDocument = iApplication.ActiveDocument
iKompasDocument2D = KAPI7.IKompasDocument2D(iDocument)

# Открываем файл и записываем в массив.                                 
f1 = open([b]"D:\z11.cdm[/b]", "r")
m=[]
for   line in f1.readlines():
      m.append(line)

# Сдвиг результирующей кривой по Y
sdvig_y=100

# Начальный сдвиг для соединения кривых.
sdvig=0
for   line in m:
     if line<>'\n':

        # Если начало кривой, открывается массив.
        if line[:-1]=="iDocument2D.ksBezier(0, 1)":
             modn=[]
        # Запись в массив точек.
        if line[0:19]=="iDocument2D.ksPoint":
             tm=line[20:-4]
             t=tm.split(",")
             k=float(t[0])+float(t[1])*1j
             modn.append(k)

        # При завершении кривой, обработка.
        if line[:-1]=="obj = iDocument2D.ksEndObj()":
             # Длина прямого участка считается по начальной точек кривой.
             dlin=modn[0].real
             dlin=dlin-100*int(dlin/100)
             # Рисуем первый участок.
             obj = iDocument2D.ksLineSeg(sdvig, 25.0+sdvig_y, sdvig+dlin, 25.0+sdvig_y, 1)
             # Начало массива точек кривой .
             iDocument2D.ksBezier(0, 1)
             for n in range(len(modn)):
                 tmp=modn[n].real   
                 bx=tmp-100*int(tmp/100)
                 # Запись точек кривой.
                 iDocument2D.ksPoint(sdvig+bx, modn[n].imag+sdvig_y, 0)
                 # Точка симметрии.
                 tsim=sdvig+bx
             # Реверс массива.
             modn.reverse()

             for n in range(len(modn)-1):
                 tmp=modn[n+1].real   
                 bx=tmp-100*int(tmp/100)
                 # Добавка для симметричной кривой .
                 dob=2*(tsim-bx-sdvig)   

                 iDocument2D.ksPoint(sdvig+bx+dob, modn[n+1].imag+sdvig_y, 0)
                 tsdv=sdvig+bx+dob             
             # Сдвиг для стыковки участков.
             sdvig=tsdv

             # Рисуем кривую и отрезок.
             obj = iDocument2D.ksEndObj()                   
             obj = iDocument2D.ksLineSeg(sdvig, 25.0+sdvig_y, sdvig+dlin, 25.0+sdvig_y, 1)
             sdvig=sdvig+dlin

f1.close

Vitalij Lysanov


Есть вариант с со свободным заданием кривых по горизонтали.

Ровный отрезок помещаем перед кривой.

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