Чтение текстового STL

Автор Vitalij Lysanov, 11.03.16, 01:00:57

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

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

Vitalij Lysanov


200 треугольников строит за  2 минуты.

Операторы:

import Kompas10API7, LDefin3D, LDefin2D
Kompas, doc3d = start3d()
#Kompas.Visible=False
#Kompas.Visible=True

ускоряют построение в два раза.



По точкам STL файла строим отрезки, по отрезкам строим заплатки.

Оптическими свойствами поверхности можно управлять программно.

Цвет линии можно приблизить к цвету с поверхности.

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

Основа кода записана в графическом режиме с доработками.


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

iDocument3D = iKompasObject.ActiveDocument3D()

iDocument = iApplication.ActiveDocument
iKompasDocument3D = KAPI7.IKompasDocument3D(iDocument)






import Kompas10API7, LDefin3D, LDefin2D
Kompas, doc3d = start3d()

#Kompas.Visible=False
#Kompas.Visible=True
#Kompas.Visible=False



m=[]
t=[]
f1 = open("D:\New.stl", "r")
f2=  open("D:\Newstl.txt", "w")
for   line in f1.readlines():
      m.append(line)

for   line0 in m:
                                       #   print "15",line
    line=line0.replace(",", ".")
   
#    if line[0] == "v":     
#   print line
    if len(line)>18 and line[9] == "v":     
       line=line[9:]
      # print line
       
       if line<>'\n':     

            t=line.split(" ")

            if t[1].find("E")==-1:

                 tmp=str(t[1])
                 tmp1=tmp.replace(",", ".")

                 f2.write(str(tmp1))
            else:
                 f2.write(str(0))

            f2.write("\t")

            if t[2].find("E")==-1:
                 f2.write(str(t[2]))
            else:
                 f2.write(str(0))

            f2.write("\t")

            if t[3].find("E")==-1:
                 f2.write(str(t[3]))
            else:
                 f2.write(str(0))
     
f1.close()
f2.close()


         #222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
m=[]
t=[]
f1 = open("D:\Newstl.txt", "r")
f2 = open("D:\Newstk.txt", "w")




#KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK

iPart7 = iKompasDocument3D.TopPart
iPart = iDocument3D.GetPart(LDefin3D.pTop_Part)
iAuxiliaryGeomContainer = iPart7._oleobj_.QueryInterface(KAPI7.NamesToIIDMap['IAuxiliaryGeomContainer'], pythoncom.IID_IDispatch)
iAuxiliaryGeomContainer = KAPI7.IAuxiliaryGeomContainer(iAuxiliaryGeomContainer)
iLineSegments3D = iAuxiliaryGeomContainer.LineSegments3D
   
#KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK



for   line in f1.readlines():
      m.append(line)

#000000000000000000000000000000000000000000000000000
r=(len(m))/3
for nn in range((r)):
    n=nn*3
    line0=m[n-1-2]
    line1=m[n+0-2]
    line2=m[n+1-2]
    n=n+3
   

    t=line0.split("\t")
    x0=t[0]
    y0=t[1]
    z0=t[2]
    print
    print t
    print x0,y0,z0
    t=line1.split("\t")
    x1=t[0]
    y1=t[1]
    z1=t[2]
         
    t=line2.split("\t")
    x2=t[0]
    y2=t[1]
    z2=t[2]

#    iPart7 = iKompasDocument3D.TopPart
#    iPart = iDocument3D.GetPart(LDefin3D.pTop_Part)
#    iAuxiliaryGeomContainer = iPart7._oleobj_.QueryInterface(KAPI7.NamesToIIDMap['IAuxiliaryGeomContainer'], pythoncom.IID_IDispatch)
#    iAuxiliaryGeomContainer = KAPI7.IAuxiliaryGeomContainer(iAuxiliaryGeomContainer)
#    iLineSegments3D = iAuxiliaryGeomContainer.LineSegments3D
    iLineSegment3D = iLineSegments3D.Add()                           # vitiraet
    iLineSegment3D.BuildingType = CONST3D7.constants.ksLSTTwoPoints
    iLineSegment3D.SetPoint(True, x0, y0, z0)
    iLineSegment3D.SetPoint(False, x1, y1, z1)
    iLineSegment3D.SetPointType(True, CONST3D7.constants.ksPParamCoord)
    iLineSegment3D.SetPointType(False, CONST3D7.constants.ksPParamCoord)
    iParameters = iLineSegment3D.PointParameters(True)
    iParameters = iLineSegment3D.PointParameters(False)
    iLineSegment3D.Update()


#   iPart7 = iKompasDocument3D.TopPart
#   iPart = iDocument3D.GetPart(LDefin3D.pTop_Part)
#   iAuxiliaryGeomContainer = iPart7._oleobj_.QueryInterface(KAPI7.NamesToIIDMap['IAuxiliaryGeomContainer'], pythoncom.IID_IDispatch)
#   iAuxiliaryGeomContainer = KAPI7.IAuxiliaryGeomContainer(iAuxiliaryGeomContainer)
#   iLineSegments3D = iAuxiliaryGeomContainer.LineSegments3D
    iLineSegment3D = iLineSegments3D.Add()
    iLineSegment3D.BuildingType = CONST3D7.constants.ksLSTTwoPoints
    iLineSegment3D.SetPoint(True, x0, y0, z0)
    iLineSegment3D.SetPoint(False, x2, y2, z2)
    iLineSegment3D.SetPointType(True, CONST3D7.constants.ksPParamCoord)
    iLineSegment3D.SetPointType(False, CONST3D7.constants.ksPParamCoord)
    iParameters = iLineSegment3D.PointParameters(True)
    iParameters = iLineSegment3D.PointParameters(False)
    iLineSegment3D.Update()

   #  iPart7 = iKompasDocument3D.TopPart
##
##    iPart7 = iKompasDocument3D.TopPart


#      iPart = iDocument3D.GetPart(LDefin3D.pTop_Part)   
##    iPart = iDocument3D.GetPart(LDefin3D.pTop_Part)
##    iAuxiliaryGeomContainer = iPart7._oleobj_.QueryInterface(KAPI7.NamesToIIDMap['IAuxiliaryGeomContainer'], pythoncom.IID_IDispatch)
##    iAuxiliaryGeomContainer = KAPI7.IAuxiliaryGeomContainer(iAuxiliaryGeomContainer)
##    iLineSegments3D = iAuxiliaryGeomContainer.LineSegments3D
    iLineSegment3D = iLineSegments3D.Add()
    iLineSegment3D.BuildingType = CONST3D7.constants.ksLSTTwoPoints
    iLineSegment3D.SetPoint(True, x1, y1, z1)
    iLineSegment3D.SetPoint(False, x2, y2, z2)
    iLineSegment3D.SetPointType(True, CONST3D7.constants.ksPParamCoord)
    iLineSegment3D.SetPointType(False, CONST3D7.constants.ksPParamCoord)
    iParameters = iLineSegment3D.PointParameters(True)
    iParameters = iLineSegment3D.PointParameters(False)
    iLineSegment3D.Update()


   
    sx0=(float(x0)+float(x1))/2.0
    sy0=(float(y0)+float(y1))/2.0
    sz0=(float(z0)+float(z1))/2.0

   

    sx1=(float(x1)+float(x2))/2.0
    sy1=(float(y1)+float(y2))/2.0
    sz1=(float(z1)+float(z2))/2.0

    sx2=(float(x0)+float(x2))/2.0
    sy2=(float(y0)+float(y2))/2.0
    sz2=(float(z0)+float(z2))/2.0



  #  iPart7 = iKompasDocument3D.TopPart
  #  iPart = iDocument3D.GetPart(LDefin3D.pTop_Part)
    iSurfaceContainer = iPart7._oleobj_.QueryInterface(KAPI7.NamesToIIDMap['ISurfaceContainer'], pythoncom.IID_IDispatch)
    iSurfaceContainer = KAPI7.ISurfaceContainer(iSurfaceContainer)
    iSurfacePatches = iSurfaceContainer.SurfacePatches
    iSurfacePatch = iSurfacePatches.Add()
    iCollection = iPart.EntityCollection(LDefin3D.o3d_edge)
    iCollection.SelectByPoint(sx0, sy0, sz0)
    iAxis = iCollection.Last()
    obj0 = iKompasObject.TransferInterface(iAxis, CONST2D7.constants.ksAPI7Dual, 0)

    iCollection = iPart.EntityCollection(LDefin3D.o3d_edge)
    iCollection.SelectByPoint(sx1, sy1, sz1)
    iAxis = iCollection.Last()
    obj1 = iKompasObject.TransferInterface(iAxis, CONST2D7.constants.ksAPI7Dual, 0)

    iCollection = iPart.EntityCollection(LDefin3D.o3d_edge)
    iCollection.SelectByPoint(sx2, sy2, sz2)
    iAxis = iCollection.Last()
    obj2 = iKompasObject.TransferInterface(iAxis, CONST2D7.constants.ksAPI7Dual, 0)
    arrrayObjects = [obj0, obj1, obj2]
    iSurfacePatch.Edges = arrrayObjects
    iColorParam7 = iSurfacePatch._oleobj_.QueryInterface(KAPI7.NamesToIIDMap['IColorParam7'], pythoncom.IID_IDispatch)
    iColorParam7 = KAPI7.IColorParam7(iColorParam7)
    iColorParam7.Ambient = 0.50000000000
    iColorParam7.Color = 9474192
    iColorParam7.Diffuse = 0.60000000000
    iColorParam7.Emission = 0.50000000000
    iColorParam7.Shininess = 0.80000000000
    iColorParam7.Specularity = 0.80000000000
    iColorParam7.Transparency = 1.00000000000
    iSurfacePatch.Update()













f1.close()
f2.close()

#Kompas.Visible=True
#Kompas.Visible=False
#Kompas.Visible=True

Vitalij Lysanov

#1
По адресу:
http://www.edge.no/wiki/Python_VTK

Рассказывают про vtk_visualizer

В примере  к vtk_visualizer увидел знакомую матрицу преобразования
.
[[  1.   0.   2.  15.]
[  0.   1.   2.  10.]
[  0.   0.   1.   0.]
[  0.   0.   0.   1.]]
15,10,0 это смещение по координатам, добавил еще 2 и 2, исказило болт.
https://yadi.sk/i/nSxw_WjqqCZva
https://yadi.sk/i/5hxd7uymqCa5r

import numpy as np
from vtk_visualizer import *
vtkControl = VTKVisualizerControl()
vtkControl.AddSTLActor(filename)
# Get ID of last actor added
nID = vtkControl.GetLastActorID()

# 4x4 matrix for translation of origin to position [5,10,0]
T = np.eye(4)
T[:3,3] = np.array([5,10,0])

# Apply transformation
vtkControl.SetActorTransform(nID, T)



Матрица может обеспечить сдвиг по координатам, вращение и деформацию.
VTK можно подключать и на CИ.

А как-то многогранную призму в цилиндр можно восстановить?

Vitalij Lysanov


Рисует без оглядки на окружение.

Добавил цилиндр из примера.