Типовой сценарий построения поверхностей

Автор Vitalij Lysanov, 19.07.21, 19:45:42

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

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

Vitalij Lysanov

19.07.21, 19:45:42 Последнее редактирование: 20.07.21, 00:24:47 от Vitalij Lysanov



Типовой сценарий построения поверхностей

Рис       Семейство поверхностей при изменении одной опорной точки

    t1=np.array([42, -24, -12])

#    t2=np.array([-43, -4, 54])
    t2=np.array([-p, -4, p])



    t3=np.array([-131, 49, 1])
    t4=np.array([-24, 9, -14])



    t112=np.array([10, -22, 49])

    t114=np.array([19, -1, -17])

    t213=np.array([-70, 21, 13])

    t324=np.array([-52, 22, -17])
    t314=np.array([-102, 61, 59])
Задание на построение.
p как раз параметр для семейства поверхностей.


Сразу можно сказать что не заметил разницы между построением поверхностей по семейству кривых и заплаткой.

Заплатку легче программировать. Грубо говоря, она пишется рекордером.

Система обозначений для облегчения набора.

t1, t2, t3, t4  - точки

t112             -  первая промежуточная точка между первой и второй
t122             -  вторая промежуточная точка между первой и второй

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




    iPart7 = kompas_document_3d.TopPart
    iPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)

    iSurfaceContainer = iPart7._oleobj_.QueryInterface(kompas_api7_module.ISurfaceContainer.CLSID, pythoncom.IID_IDispatch)
    iSurfaceContainer = kompas_api7_module.ISurfaceContainer(iSurfaceContainer)
    iSurfacePatches = iSurfaceContainer.SurfacePatches
    iSurfacePatch = iSurfacePatches.Add()
    iCollection = iPart.EntityCollection(kompas6_constants_3d.o3d_edge)
    iCollection.SelectByPoint(      t112[0],    t112[1],    t112[2] )
    iAxis = iCollection.Last()
    obj0 = kompas_object.TransferInterface(iAxis, kompas6_constants.ksAPI7Dual, 0)
    iCollection = iPart.EntityCollection(kompas6_constants_3d.o3d_edge)
    iCollection.SelectByPoint(   t213[0],    t213[1],    t213[2])
    iAxis = iCollection.Last()
    obj1 = kompas_object.TransferInterface(iAxis, kompas6_constants.ksAPI7Dual, 0)
    iCollection = iPart.EntityCollection(kompas6_constants_3d.o3d_edge)
    iCollection.SelectByPoint(   t314[0],    t314[1],    t314[2])
    iAxis = iCollection.Last()
    obj2 = kompas_object.TransferInterface(iAxis, kompas6_constants.ksAPI7Dual, 0)
    iCollection = iPart.EntityCollection(kompas6_constants_3d.o3d_edge)
    iCollection.SelectByPoint(   t114[0],    t114[1],    t114[2])
    iAxis = iCollection.Last()
    obj3 = kompas_object.TransferInterface(iAxis, kompas6_constants.ksAPI7Dual, 0)
    arrrayObjects = [obj0, obj1, obj2, obj3]

    iSurfacePatch.Edges = arrrayObjects
    iColorParam7 = iSurfacePatch._oleobj_.QueryInterface(kompas_api7_module.IColorParam7.CLSID, pythoncom.IID_IDispatch)
    iColorParam7 = kompas_api7_module.IColorParam7(iColorParam7)
    iColorParam7.Ambient = 0.5
    iColorParam7.Color = 9474192
    iColorParam7.Diffuse = 0.6
    iColorParam7.Emission = 0.5
    iColorParam7.Shininess = 0.8
    iColorParam7.Specularity = 0.8
    iColorParam7.Transparency = 1
    iSurfacePatch.Update()

Код заплатки записанный рекордером, только точку входа привязали к переменным.
Промежуточные точки все уникальные, поэтому просто берем промежуточные точки.

Можно точки нарисовать для лучшей ориентировки






Полный код


# -*- 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_3d = kompas_api7_module.IKompasDocument3D(kompas_document)
iDocument3D = kompas_object.ActiveDocument3D()

import numpy as np


def pa(p):
    t1=np.array([42, -24, -12])

#    t2=np.array([-43, -4, 54])
    t2=np.array([-p, -4, p])



    t3=np.array([-131, 49, 1])
    t4=np.array([-24, 9, -14])



    t112=np.array([10, -22, 49])

    t114=np.array([19, -1, -17])

    t213=np.array([-70, 21, 13])

    t324=np.array([-52, 22, -17])
    t314=np.array([-102, 61, 59])




    iPart7 = kompas_document_3d.TopPart
    iPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)

    obj = iPart.NewEntity(kompas6_constants_3d.o3d_spline)
    iDefinition = obj.GetDefinition()
    iDefinition.closed = False
    iDefinition.degree = 4
    iDefinition.splineOnPoles = False
    iDefinition.AddVertex(      t1[0],      t1[1],      t1[2],          0)
    iDefinition.AddVertex(      t112[0],    t112[1],    t112[2],        0)
    iDefinition.AddVertex(      t2[0],      t2[1],      t2[2],          0)
    obj.name = "Сплайн:1"
    iColorParam = obj.ColorParam()
    iColorParam.color = 16711680
    obj.Create()
    iPart7 = kompas_document_3d.TopPart
    iPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)

    obj = iPart.NewEntity(kompas6_constants_3d.o3d_spline)
    iDefinition = obj.GetDefinition()
    iDefinition.closed = False
    iDefinition.degree = 4
    iDefinition.splineOnPoles = False
    iDefinition.AddVertex(      t1[0],      t1[1],      t1[2],          0)
    iDefinition.AddVertex(      t114[0],      t114[1],      t114[2],          0)
    iDefinition.AddVertex(      t4[0],      t4[1],      t4[2],          0)
    obj.name = "Сплайн:2"
    iColorParam = obj.ColorParam()
    iColorParam.color = 16711680
    obj.Create()
    iPart7 = kompas_document_3d.TopPart
    iPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)

    obj = iPart.NewEntity(kompas6_constants_3d.o3d_spline)
    iDefinition = obj.GetDefinition()
    iDefinition.closed = False
    iDefinition.degree = 4
    iDefinition.splineOnPoles = False
    iDefinition.AddVertex(      t3[0],          t3[1],          t3[2],          0)
    iDefinition.AddVertex(      t314[0],        t314[1],        t314[2],          0)
    iDefinition.AddVertex(      t324[0],        t324[1],        t324[2],          0)
    iDefinition.AddVertex(      t4[0],          t4[1],          t4[2],          0)
    obj.name = "Сплайн:3"
    iColorParam = obj.ColorParam()
    iColorParam.color = 16711680
    obj.Create()
    iPart7 = kompas_document_3d.TopPart
    iPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)

    obj = iPart.NewEntity(kompas6_constants_3d.o3d_spline)
    iDefinition = obj.GetDefinition()
    iDefinition.closed = False
    iDefinition.degree = 4
    iDefinition.splineOnPoles = False
    iDefinition.AddVertex(      t2[0],          t2[1],          t2[2],          0)
    iDefinition.AddVertex(      t213[0],        t213[1],        t213[2],          0)
    iDefinition.AddVertex(      t3[0],          t3[1],          t3[2],          0)
    obj.name = "Сплайн:4"
    iColorParam = obj.ColorParam()
    iColorParam.color = 16711680
    obj.Create()







    iPart7 = kompas_document_3d.TopPart
    iPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)

    iSurfaceContainer = iPart7._oleobj_.QueryInterface(kompas_api7_module.ISurfaceContainer.CLSID, pythoncom.IID_IDispatch)
    iSurfaceContainer = kompas_api7_module.ISurfaceContainer(iSurfaceContainer)
    iSurfacePatches = iSurfaceContainer.SurfacePatches
    iSurfacePatch = iSurfacePatches.Add()
    iCollection = iPart.EntityCollection(kompas6_constants_3d.o3d_edge)
    iCollection.SelectByPoint(      t112[0],    t112[1],    t112[2] )
    iAxis = iCollection.Last()
    obj0 = kompas_object.TransferInterface(iAxis, kompas6_constants.ksAPI7Dual, 0)
    iCollection = iPart.EntityCollection(kompas6_constants_3d.o3d_edge)
    iCollection.SelectByPoint(   t213[0],    t213[1],    t213[2])
    iAxis = iCollection.Last()
    obj1 = kompas_object.TransferInterface(iAxis, kompas6_constants.ksAPI7Dual, 0)
    iCollection = iPart.EntityCollection(kompas6_constants_3d.o3d_edge)
    iCollection.SelectByPoint(   t314[0],    t314[1],    t314[2])
    iAxis = iCollection.Last()
    obj2 = kompas_object.TransferInterface(iAxis, kompas6_constants.ksAPI7Dual, 0)
    iCollection = iPart.EntityCollection(kompas6_constants_3d.o3d_edge)
    iCollection.SelectByPoint(   t114[0],    t114[1],    t114[2])
    iAxis = iCollection.Last()
    obj3 = kompas_object.TransferInterface(iAxis, kompas6_constants.ksAPI7Dual, 0)
    arrrayObjects = [obj0, obj1, obj2, obj3]

    iSurfacePatch.Edges = arrrayObjects
    iColorParam7 = iSurfacePatch._oleobj_.QueryInterface(kompas_api7_module.IColorParam7.CLSID, pythoncom.IID_IDispatch)
    iColorParam7 = kompas_api7_module.IColorParam7(iColorParam7)
    iColorParam7.Ambient = 0.5
    iColorParam7.Color = 9474192
    iColorParam7.Diffuse = 0.6
    iColorParam7.Emission = 0.5
    iColorParam7.Shininess = 0.8
    iColorParam7.Specularity = 0.8
    iColorParam7.Transparency = 1
    iSurfacePatch.Update()

for p in range(12,68,4):
    pa(p)



___

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



 


           

Vitalij Lysanov



Это все хорошо, но нужно еще лучше
Четыре точки в абсолютных координатах набрать, это еще можно.

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

Вектора задаются в относительных координатах (относительно своих опорных точек)



Это точки
    t1=np.array([0,     0,      0])
    t2=np.array([100,   0,      0])
    t3=np.array([100,   100,    0])
    t4=np.array([0,     100,    0])
Это поставит одну дополнительную точку и поднимет вверх на 20
    tm1.append(t1)
    tm1.append(np.array([0,     0,      20      ]))
    tm1.append(t2)

Это поставит четыре дополнительные точки и поднимет в соответствии заданием вектора
    tm4=[]
    tm4.append(t1)
    tm4.append(np.array([0,     0,      20      ]))
    tm4.append(np.array([0,     0,      -20      ]))
    tm4.append(np.array([0,     0,      20      ]))
    tm4.append(np.array([0,     0,      -20      ]))
    tm4.append(t4)


Рис    Одна дополнительная точка, один всплеск


Рис Две дополнительные точки, два всплеска





Рис Три дополнительные точки, три всплеска




Рис
Рис        Четыре дополнительные точки, четыре всплеска


Рис   Это один всплеск, только вектор немного переместим в пространстве


Дальше уже нужно занать, что требуется построить.
  

Полный код
# -*- 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_3d = kompas_api7_module.IKompasDocument3D(kompas_document)
iDocument3D = kompas_object.ActiveDocument3D()

import numpy as np


def Tochka(t):
    iPart7 = kompas_document_3d.TopPart
    iPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)

    iModelContainer = iPart7._oleobj_.QueryInterface(kompas_api7_module.IModelContainer.CLSID, pythoncom.IID_IDispatch)
    iModelContainer = kompas_api7_module.IModelContainer(iModelContainer)
    iPoints3D = iModelContainer.Points3D
    iPoint3D = iPoints3D.Add()
    iPoint3D.ParameterType = kompas6_constants_3d.ksPParamCoord
    iPoint3D.Symbol = kompas6_constants.ksPlusPointTwo
    iPoint3D.X = float(t[0])
    iPoint3D.Y = float(t[1])
    iPoint3D.Z = float(t[2])
    iPoint3D.Update()


def pa(p):
    t1=np.array([0,     0,      0])
    t2=np.array([100,   0,      0])
    t3=np.array([100,   100,    0])
    t4=np.array([0,     100,    0])





# 111111111111111111111111111111111111111111111111111111
    tm1=[]

    tm1.append(t1)
    tm1.append(np.array([30,     30,      20      ]))
    tm1.append(t2)


#22222222222222222222222222222222222222222222222222222222
    tm2=[]

    tm2.append(t2)
    tm2.append(np.array([0,     0,      20     ]))
    tm2.append(np.array([0,     0,      -20      ]))
    tm2.append(t3)


#33333333333333333333333333333333333333333333333333333333
    tm3=[]
    tm3.append(t3)
    tm3.append(np.array([0,     0,      20     ]))
    tm3.append(np.array([0,     0,      -20      ]))
    tm3.append(np.array([0,     0,      20     ]))
    tm3.append(t4)


#4444444444444444444444444444444444444444444444444444444444
    tm4=[]
    tm4.append(t1)
    tm4.append(np.array([0,     0,      20      ]))
    tm4.append(np.array([0,     0,      -20      ]))
    tm4.append(np.array([0,     0,      20      ]))
    tm4.append(np.array([0,     0,      -20      ]))
    tm4.append(t4)




#11111111111111111111111111111111111111111111111111111111111111111


#    print(tm1)

    iPart7 = kompas_document_3d.TopPart
    iPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)

    obj = iPart.NewEntity(kompas6_constants_3d.o3d_spline)
    iDefinition = obj.GetDefinition()
    iDefinition.closed = False
    iDefinition.degree = 4
    iDefinition.splineOnPoles = False
    n=len(tm1)
    tp1=tm1[0]
    tp2=tm1[n-1]


    iDefinition.AddVertex(      tm1[0][0],      tm1[0][1],      tm1[0][2],          0)

    for nnn in range(1,n-1,1):
        ttt=nnn*(tp2-tp1)/(n-1)+tp1+tm1[nnn]
 #       Tochka(ttt)
        iDefinition.AddVertex(      ttt[0],      ttt[1],      ttt[2],          0)
        if nnn==1:
            tsv1=ttt
    iDefinition.AddVertex(      tm1[n-1][0],      tm1[n-1][1],      tm1[n-1][2],          0)



    obj.name = "Сплайн:1"
    iColorParam = obj.ColorParam()
    iColorParam.color = 16711680
    obj.Create()
#___________________________________________________________________________________













#333333333333333333333333333333333333333333333333333333333333333333333333333333333333
    iPart7 = kompas_document_3d.TopPart
    iPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)


    obj = iPart.NewEntity(kompas6_constants_3d.o3d_spline)
    iDefinition = obj.GetDefinition()
    iDefinition.closed = False
    iDefinition.degree = 4
    iDefinition.splineOnPoles = False

    n=len(tm3)
    tp1=tm3[0]
    tp2=tm3[n-1]

    iDefinition.AddVertex(      tm3[0][0],      tm3[0][1],      tm3[0][2],          0)

    for nnn in range(1,n-1,1):
        ttt=nnn*(tp2-tp1)/(n-1)+tp1+tm3[nnn]
        iDefinition.AddVertex(      ttt[0],      ttt[1],      ttt[2],          0)
        if nnn==1:
            tsv3=ttt

    iDefinition.AddVertex(      tm3[n-1][0],      tm3[n-1][1],      tm3[n-1][2],          0)


    obj.name = "Сплайн:2"
    iColorParam = obj.ColorParam()
    iColorParam.color = 16711680
    obj.Create()
#__________________________________________________________________________________

















#4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
    iPart7 = kompas_document_3d.TopPart
    iPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)

    obj = iPart.NewEntity(kompas6_constants_3d.o3d_spline)
    iDefinition = obj.GetDefinition()
    iDefinition.closed = False
    iDefinition.degree = 4
    iDefinition.splineOnPoles = False

    n=len(tm4)
    tp1=tm4[0]
    tp2=tm4[n-1]

    iDefinition.AddVertex(      tm4[0][0],      tm4[0][1],      tm4[0][2],          0)

    for nnn in range(1,n-1,1):
        ttt=nnn*(tp2-tp1)/(n-1)+tp1+tm4[nnn]
        iDefinition.AddVertex(      ttt[0],      ttt[1],      ttt[2],          0)
        if nnn==1:
            tsv4=ttt

    iDefinition.AddVertex(      tm4[n-1][0],      tm4[n-1][1],      tm4[n-1][2],          0)

    obj.name = "Сплайн:3"
    iColorParam = obj.ColorParam()
    iColorParam.color = 16711680
    obj.Create()
#_________________________________________________________________________________________________







#22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
    iPart7 = kompas_document_3d.TopPart
    iPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)

    obj = iPart.NewEntity(kompas6_constants_3d.o3d_spline)
    iDefinition = obj.GetDefinition()
    iDefinition.closed = False
    iDefinition.degree = 4
    iDefinition.splineOnPoles = False
    n=len(tm2)
    tp1=tm2[0]
    tp2=tm2[n-1]

    iDefinition.AddVertex(      tm2[0][0],      tm2[0][1],      tm2[0][2],          0)

    for nnn in range(1,n-1,1):
        ttt=nnn*(tp2-tp1)/(n-1)+tp1+tm2[nnn]
        iDefinition.AddVertex(      ttt[0],      ttt[1],      ttt[2],          0)
        if nnn==1:
            tsv2=ttt


    iDefinition.AddVertex(      tm2[n-1][0],      tm2[n-1][1],      tm2[n-1][2],          0)



                                                                                                                #    iDefinition.AddVertex(      t2[0],          t2[1],          t2[2],          0)
                                                                                                                #    iDefinition.AddVertex(      t213[0],        t213[1],        t213[2],          0)
                                                                                                                #    iDefinition.AddVertex(      t3[0],          t3[1],          t3[2],          0)
    obj.name = "Сплайн:4"
    iColorParam = obj.ColorParam()
    iColorParam.color = 16711680
    obj.Create()
#______________________________________________________________________________________________






    iPart7 = kompas_document_3d.TopPart
    iPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)

    iSurfaceContainer = iPart7._oleobj_.QueryInterface(kompas_api7_module.ISurfaceContainer.CLSID, pythoncom.IID_IDispatch)
    iSurfaceContainer = kompas_api7_module.ISurfaceContainer(iSurfaceContainer)
    iSurfacePatches = iSurfaceContainer.SurfacePatches
    iSurfacePatch = iSurfacePatches.Add()
    iCollection = iPart.EntityCollection(kompas6_constants_3d.o3d_edge)
    iCollection.SelectByPoint(      tsv1[0],    tsv1[1],    tsv1[2] )
    iAxis = iCollection.Last()
    obj0 = kompas_object.TransferInterface(iAxis, kompas6_constants.ksAPI7Dual, 0)
    iCollection = iPart.EntityCollection(kompas6_constants_3d.o3d_edge)
    iCollection.SelectByPoint(      tsv2[0],    tsv2[1],    tsv2[2])
    iAxis = iCollection.Last()
    obj1 = kompas_object.TransferInterface(iAxis, kompas6_constants.ksAPI7Dual, 0)
    iCollection = iPart.EntityCollection(kompas6_constants_3d.o3d_edge)
    iCollection.SelectByPoint(    tsv3[0],    tsv3[1],    tsv3[2])
    iAxis = iCollection.Last()
    obj2 = kompas_object.TransferInterface(iAxis, kompas6_constants.ksAPI7Dual, 0)
    iCollection = iPart.EntityCollection(kompas6_constants_3d.o3d_edge)
    iCollection.SelectByPoint(    tsv4[0],    tsv4[1],    tsv4[2])
    iAxis = iCollection.Last()
    obj3 = kompas_object.TransferInterface(iAxis, kompas6_constants.ksAPI7Dual, 0)
    arrrayObjects = [obj0, obj1, obj2, obj3]

    iSurfacePatch.Edges = arrrayObjects
    iColorParam7 = iSurfacePatch._oleobj_.QueryInterface(kompas_api7_module.IColorParam7.CLSID, pythoncom.IID_IDispatch)
    iColorParam7 = kompas_api7_module.IColorParam7(iColorParam7)
    iColorParam7.Ambient = 0.5
    iColorParam7.Color = 9474192
    iColorParam7.Diffuse = 0.6
    iColorParam7.Emission = 0.5
    iColorParam7.Shininess = 0.8
    iColorParam7.Specularity = 0.8
    iColorParam7.Transparency = 1
    iSurfacePatch.Update()

#for p in range(12,68,4):
pa(np.array([0,0,0]))



Ссылка на текст
https://docs.google.com/document/d/1tZT4qR8p2eHff-Pon_5qlEG6pTmyOXtf2izDxN8hpcE/edit?usp=sharing





           

VLaD-Sh

И в какой области это применяется? Авиа?

p3452

Жаль, что в КОМПАС-3D, до сих пор, нет МОЩНОГО и БЫСТРОГО вычислительного приложения (стоковый FEM не в счет!), что бы можно было, в режиме "реального времени", менять топологию и тут же ее просчитывать!

А, ТС, спасибо за полезные и познавательные эксперименты!

Vitalij Lysanov

Цитата: VLaD-Sh от 20.07.21, 11:11:19И в какой области это применяется? Авиа?



В Авиа заплаткой не отделаешься.

Крыло обычно строят по сечениям в плоскостях.
Сами сечения наверное по расчетам, а расчеты это цифры, и цифры как раз можно завести в программу.

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





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

В середине проекта трудно подключиться, желательно подключать цифры с самого начала

__

Пробовал продолжить поверхность второй заплаткой.
Общий сплайн получается для построения, плавность соединения тут не считается, все внимание на текущие точки заплатки
 


Vitalij Lysanov




Продолжение про Поверхность по траектории и Поверхность по сети кривых

Поверхность по траектории предполагает эскиз.
Эскиз при движении по траектории желательно вращать и маштабировать.

Если в эскизе сплайн, много точек вручную задавать нежелательно, можно только больше неравномерности сделать. В примере 8 дополнительных точек.

Можно взять две направляющие и эскиз разместить между этими направляющими. Что обеспечит и масштабирование и поворот эскиза.

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

Нормаль к треугольнику в принципе есть и в самом формате  STL.

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

Картинки:



Рис      Край поверхности формата STL. Отрезки соединяют две направляющие.
Это слишком близко трейгольники расположены.




Рис    Поверхность по двум сплайнам для формата STL





Рис   Вместо направляющих уже треугольники (они должны быть ближе между собой).
Виден отрезок между направляющими и точки равномерно расположенные на отрезке.

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

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




Рис     Направляющие. Сплайны для выходной поверхности. Сейчас по ординате фиксированные числа, не зависят от расстояния между направляющими, но это поправимо для конкретных задач. Если функция по ординате, это еще лучше. 




Рис      Поверхность по сечениям или Поверхность по сети кривых. Поверхности строит немного разные. Когда расстояния будут ближе, разность поверхностей уменьшится.




Поверхность по сечениям тоже берет такие сплайны для построения.
Наверное от конкретных задач зависит способ построения. 




Код строит только сплайны для поверхностей. Сами поверхности вручную.
Вначале идут массивы для двух направляющих.


spl_1=np.array([
            [-27,   -22,    10],
            [18,    45,     -21],
            [18,    131,    -59],
            [7,     137,    -73],
            [14,    186,    -115],
            [24,    236,    -75],
            [-32,   284,    -115]])

print(spl_1)


spl_2=np.array([
            [-15,   26,     64],
            [-12,   71,     21],
            [-23,   164,    22],
            [-6,    188,    -87],
            [-6,    212,    -105],
            [-16,    232,    -55],
            [-26,   281,    -40]])






Ординаты в эскизе, это цифры 5,10, 20,5   -5,-20, -10, -5

        tv1=mt[0]+unit_vk*5
        tv2=mt[1]+unit_vk*10
        tv3=mt[2]+unit_vk*20
        tv4=mt[3]+unit_vk*5
        iDefinition.AddVertex(tv1[0], tv1[1], tv1[2], 0)
        iDefinition.AddVertex(tv2[0], tv2[1], tv2[2], 0)
        iDefinition.AddVertex(tv3[0], tv3[1], tv3[2], 0)
        iDefinition.AddVertex(tv4[0], tv4[1], tv4[2], 0)



        iDefinition.AddVertex(t2[0], t2[1], t2[2], 0)

        tn4=mt[3]-unit_vk*5
        tn3=mt[2]-unit_vk*20
        tn2=mt[1]-unit_vk*10
        tn1=mt[0]-unit_vk*5

        iDefinition.AddVertex(tn4[0], tn4[1], tn4[2], 0)
        iDefinition.AddVertex(tn3[0], tn3[1], tn3[2], 0)
        iDefinition.AddVertex(tn2[0], tn2[1], tn2[2], 0)
        iDefinition.AddVertex(tn1[0], tn1[1], tn1[2], 0)











Полный код


# -*- 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_3d = kompas_api7_module.IKompasDocument3D(kompas_document)
iDocument3D = kompas_object.ActiveDocument3D()

import numpy as np


#_______________________________________________________________
def Точка(t):
    iPart7 = kompas_document_3d.TopPart
    iPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)

    iModelContainer = iPart7._oleobj_.QueryInterface(kompas_api7_module.IModelContainer.CLSID, pythoncom.IID_IDispatch)
    iModelContainer = kompas_api7_module.IModelContainer(iModelContainer)
    iPoints3D = iModelContainer.Points3D
    iPoint3D = iPoints3D.Add()
    iPoint3D.ParameterType = kompas6_constants_3d.ksPParamCoord
    iPoint3D.Symbol = kompas6_constants.ksDotPoint
    iPoint3D.X = float(t[0])
    iPoint3D.Y = float(t[1])
    iPoint3D.Z = float(t[2])
    iPoint3D.Update()
#________________________________________________________________________


#__________________________________________________________________
def Отрезок(t1,t2):
    iPart7 = kompas_document_3d.TopPart
    iPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)

    iAuxiliaryGeomContainer = iPart7._oleobj_.QueryInterface(kompas_api7_module.IAuxiliaryGeomContainer.CLSID, pythoncom.IID_IDispatch)
    iAuxiliaryGeomContainer = kompas_api7_module.IAuxiliaryGeomContainer(iAuxiliaryGeomContainer)
    iLineSegments3D = iAuxiliaryGeomContainer.LineSegments3D
    iLineSegment3D = iLineSegments3D.Add()
    iLineSegment3D.BuildingType = kompas6_constants_3d.ksLSTTwoPoints
    iLineSegment3D.SetPoint(True, t1[0], t1[1], t1[2])
    iLineSegment3D.SetPoint(False, t2[0], t2[1], t2[2])
    iLineSegment3D.SetPointType(True, kompas6_constants_3d.ksPParamCoord)
    iLineSegment3D.SetPointType(False, kompas6_constants_3d.ksPParamCoord)
    iParameters = iLineSegment3D.PointParameters(True)
    iParameters = iLineSegment3D.PointParameters(False)
    iLineSegment3D.Update()
#_______________________________________________________________________









spl_1=np.array([
            [-27,   -22,    10],
            [18,    45,     -21],
            [18,    131,    -59],
            [7,     137,    -73],
            [14,    186,    -115],
            [24,    236,    -75],
            [-32,   284,    -115]])

print(spl_1)


spl_2=np.array([
            [-15,   26,     64],
            [-12,   71,     21],
            [-23,   164,    22],
            [-6,    188,    -87],
            [-6,    212,    -105],
            [-16,    232,    -55],
            [-26,   281,    -40]])




#_________11111111111111111____________________________________________________
iPart7 = kompas_document_3d.TopPart
iPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)

obj = iPart.NewEntity(kompas6_constants_3d.o3d_spline)
iDefinition = obj.GetDefinition()
iDefinition.closed = False
iDefinition.degree = 4
iDefinition.splineOnPoles = False


for t in spl_1:
     iDefinition.AddVertex(t[0], t[1], t[2], 0)


obj.name = "Сплайн:1"
iColorParam = obj.ColorParam()
iColorParam.color = 16711680
obj.Create()
#_____________________________________________________________















#____________2222222222222222222222______________________________________________________
iPart7 = kompas_document_3d.TopPart
iPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)

obj = iPart.NewEntity(kompas6_constants_3d.o3d_spline)
iDefinition = obj.GetDefinition()
iDefinition.closed = False
iDefinition.degree = 4
iDefinition.splineOnPoles = False

for t in spl_2:
     iDefinition.AddVertex(t[0], t[1], t[2], 0)

obj.name = "Сплайн:2"
iColorParam = obj.ColorParam()
iColorParam.color = 16711680
obj.Create()


#np.cross(a, b)

for n in range(len(spl_1)):

    Отрезок(spl_1[n],spl_2[n])
    if n>0:
        Отрезок(spl_1[n-1],spl_1[n])
        Отрезок(spl_2[n-1],spl_2[n])
        v1=spl_1[n]-spl_2[n]
        v2=spl_1[n-1]-spl_1[n]
        vk=np.cross(v1, v2)
        unit_vk=vk/ np.linalg.norm(vk)

        Отрезок(spl_1[n],spl_1[n]+unit_vk*10)
        t1=spl_1[n]
        t2=spl_2[n]




        mt=[]
        for nn in range(4):
            tnov=t1+ (nn+1)*(t2-t1)/5
            Точка(tnov)
            mt.append(tnov)


        #_________nnnnnnnnnnnnnnnnnnnnnnnnnn____________________________________________________
        iPart7 = kompas_document_3d.TopPart
        iPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)

        obj = iPart.NewEntity(kompas6_constants_3d.o3d_spline)
        iDefinition = obj.GetDefinition()
        iDefinition.closed = True
        iDefinition.degree = 4
        iDefinition.splineOnPoles = False



        iDefinition.AddVertex(t1[0], t1[1], t1[2], 0)
        tv1=mt[0]+unit_vk*5
        tv2=mt[1]+unit_vk*10
        tv3=mt[2]+unit_vk*20
        tv4=mt[3]+unit_vk*5
        iDefinition.AddVertex(tv1[0], tv1[1], tv1[2], 0)
        iDefinition.AddVertex(tv2[0], tv2[1], tv2[2], 0)
        iDefinition.AddVertex(tv3[0], tv3[1], tv3[2], 0)
        iDefinition.AddVertex(tv4[0], tv4[1], tv4[2], 0)



        iDefinition.AddVertex(t2[0], t2[1], t2[2], 0)

        tn4=mt[3]-unit_vk*5
        tn3=mt[2]-unit_vk*20
        tn2=mt[1]-unit_vk*10
        tn1=mt[0]-unit_vk*5

        iDefinition.AddVertex(tn4[0], tn4[1], tn4[2], 0)
        iDefinition.AddVertex(tn3[0], tn3[1], tn3[2], 0)
        iDefinition.AddVertex(tn2[0], tn2[1], tn2[2], 0)
        iDefinition.AddVertex(tn1[0], tn1[1], tn1[2], 0)





        obj.name = "Сплайн:1"
        iColorParam = obj.ColorParam()
        iColorParam.color = 16711680
        obj.Create()
        #_____________________________________________________________







#__________________________________________________________________

 





Ссылка на текст
<a href="https://docs.google.com/document/d/1tZT4qR8p2eHff-Pon_5qlEG6pTmyOXtf2izDxN8hpcE/edit?usp=sharing[/img]https://docs.google.com/document/d/1tZT4qR8p2eHff-Pon_5qlEG6pTmyOXtf2izDxN8hpcE/edit?usp=sharing</a>