public sub avviocalcolocosto(tipo_lamiera as string, bshowresult as boolean)
dim objfaces als Objekt
dim objface als Objekt
dim objtopfaces() als Objekt
dim dblminrange(1 bis 2) als doppelt
dim dblmaxrange(1 bis 2) als doppelt
dim dblnormal(1 bis 3) als Doppel: dim dblnormalref(1 bis 3) als Doppel
dim itopfacecount als Ganze
dim ioutlineedgecount als Ganzzahl
dim ifoldedgecount als Ganzzahl
dim objoutlineedges() als Objekt
dim objfoldedges() als Objekt
dim objedges als Objekt
dim lgfacecount als lang
dim objsharedfaces(1 bis 2) als Objekt
dim isharedfaceindex als ganze Zahl
Dim i als ganze Zahl
Dim j als ganze Zahl
Dim k als ganze Zahl
dim ifilepointer als ganze Zahl
dim dblstartpoint(1 bis 3) als doppelt
dim dblendpoint(1 bis 3) als Doppel
dim dblcenter(1 bis 3) als Doppel
dim dblradius als Doppel
dim dblstartangle als doppelt
dim dblsweepangle als doppelt
dim dblmajoraxis(1 bis 3) als Doppel
dim duplicatege als boolean
Dim dblorigin(1 bis 2) als doppelt
dim Schlagzahl lang
Dim Hubpunkte() als Doppel
Dim Hubparams() als Doppel
dim länge als doppelt
dim props als Objekt
dim dicke als doppelt
dim vars als Objekt
Durchmesser Radius als Doppel
Dim schnitt(15) als Doppel
dim dx als Doppel
dim dy als doppelt
auf Fehlerwiederaufnahme
set objapp = getobject(, "solidedge.application")
wenn er
msgbox "solid edge deve essere aperto."
Ende
Ende
auf fehler goto 0
wenn objapp.activeenvironment <> "sheetmetal" dann
msgbox "nessuna parte in lamiera aperta."
Ende
Ende
set objfoldeddoc = objapp.activedocument
Sicher, dass das Dokument ein solides Modell enthält
wenn objfoldeddoc.models.count = 0 dann
msgbox "il file aperto non contiene un modello solido."
Ende
Ende
set objprops = objfoldeddoc.properties
nomefilexls = (links(objfoldeddoc.fullname, len(objfoldeddoc.fullname) - 4) + "_costo.xls")
Norm_vector = 3
Norm_Wert = 1
set objmodel = objflatdoc.reference.body.shells(1)
Alle ebenen Gesichter im Modell.
'set objfaces = objmodel.body.faces(facetype:=igqueryplane)
set objfaces = objmodel.faces '(facetype:=igface)
' allocate Speicher, um alle Oberseiten zu speichern.
redim objtopfaces(1 zu objfaces.count / 2) als Objekt
' alle Gesichter finden und speichern, deren Normalität in der positiven z-Achse liegt.
itopfacecount = 0
für jedes objface in objfaces
' Holen Sie den parametrischen Bereich des Gesichts.
rufen objface.getparamrange(minparam:=dblminrange, maxparam:=dblmaxrange)
"bekommen Sie die Normale am Min Param Punkt.
rufen objface. getnormal(numparams:=1, params:=dblminrange, normals:=dblnormal)
' überprüfen, ob es in der positiven z Richtung spitz ist.
wenn cstr(dblnormal(norm_vector)) = cstr(norm_value) dann
' rettet dieses Gesicht, weil es eine der oberen Gesichter ist.
itopfacecount = itopfacecount + 1
set objtopfacefaces(itopfacecount) = objface
Ende
Nächste
' Platz für die Kanten zuordnen
'redim objoutlineedges(1 to objmodel.body.edges(igqueryall).count / 3) als Objekt
redim objoutlineedges(1 to objmodel.body.edges(igqueryall).count / 2) als Objekt
wenn tipo_lamiera = "virola" dann
redim objfoldedges(2) als Objekt
andere
redim objfoldedges(1 zu itopfacecount * 2) als Objekt
Ende
dim ofoldedges als Sammlung
Set vonoldedges = neue Kollektion
' initialisieren die Zähler.
ioutlineedgecount = 0
ifoldedgecount = 0
Gehen Sie durch die Oberseite und sammeln Sie alle einzigartigen Kanten. wenn die Kanten
" werden von den Oberseiten geteilt, dann werden sie seperately als Faltkanten gespeichert.
n_profili = 1
für i = 1 to itopfacecount
' trovo i loop della faccia e li sommo -1
n_profili = n_profili + objtopfaces(i).loops.count - 1
' erhalten alle Kanten des aktuellen Gesichts.
set objedges = objtopfaces(i).edges
Überprüfen Sie jeden Rand, um zu sehen, ob er mit einem anderen Gesicht geteilt wird.
für j = 1 bis objedges. Anzahl
Das andere Gesicht, das diesen Rand teilt.
rufen objedges(j).getfaces(numfaces:=lgfacecount, faces:=objsharedfaces)
Das andere Gesicht.
objsharedfaces(1) objtopfaces(i) dann
isharedfaceindex = 2
andere
isharedfaceindex = 1
Ende
' Holen Sie den parametrischen Bereich des Gesichts.
rufen objsharedfaces(isharedfaceindex).getparamrange(minparam:=dblminrange, maxparam:=dblmaxrange)
"bekommen Sie die Normale am Min Param Punkt.
call objsharedfaces(isharedfaceindex).getnormal(numparams:=1, params:=dblminrange, normals:=dblnormal)
' wenn die Normale in positiver z-Richtung zeigt, dann wird die Kante mit einer anderen Oberseite geteilt.
wenn abs(dblnormal(norm_vector)) > norm_value - 0.1 und dblnormal(norm_vector) < norm_value + 0.1 dann
Überprüfen Sie, ob diese Kante bereits berücksichtigt ist.
duplicatege = falsch
für k = 1 to ifoldedgecount
objedges(j) objfoldedges(k) dann
duplicatege = true
Ausfahrt für
Ende
Nächste
wenn nicht dupliziert
„Wenn es sich um einen Plan handelt, dann
ifoldedgecount = ifoldedgecount + 1
set objfoldedges(ifoldedgecount) = objedges(j)
vonoldedges.add (objedges(j))
Wenn
Ende
andere
' der Rand ist außen.
ioutlineedgecount = ioutlineedgecount + 1
set objoutlineedges(ioutlineedgecount) = objedges(j)
Ende
Nächste
Nächste
gesamtlänge = 0
für i = 1 bis ioutlineedgecount
Länge = 0
Wählen Sie Fall objoutlineedges(i).geometry. Typ
Falligline
call objoutlineedges(i).getendpoints(startpoint:=dblstartpoint, endpoint:=dblendpoint)
'länge der linie
länge = (dblendpoint(1) - dblstartpoint(1)) ^ 2 + (dblendpoint(2) - dblstartpoint(2)) ^ ^ 0,5
Fall igcircle
' bestimmen, ob die Kante tatsächlich ein Kreis oder ein Bogen ist.
wenn objoutlineedges(i).geschlossen dann
rufen objoutlineedges(i).geometry.getcircledata(Mittepunkt:=dblcenter, Achsvektor:=dblnormal, Radius:=dblradius)
länge = dblradius * 2 * pi
andere
call getarcdata(objoutlineedges(i), true, dblcenter, dblnormal, dblstartpoint, dblendpoint, _
dblstartangle, dblsweepangle, dblmajoraxis, dblradius)
' den Startwinkel ändern, so dass er auf der Hauptachsenrichtung basiert. denn wir sind nur
"betreffend den Bogen in 2d Raum an der x-y Stelle sollte der Startwinkel relativ sein
' auf die x-Achse statt.
dblorigin(1) = 0
dblorigin(2) = 0
dblstartangle = dblstartangle + Lager(dblorigin, dblmajoraxis)
länge = dblradius * dblsweepangle
Ende
Fall igellipse, igbsplinecurve
' Schlag ellipsen und bspline Kurven.
rufen objoutlineedges(i).getstrokedata(Toleranz:=0.001, Hubzähler:=Strokecount, Punkte:=Strokepoints, params:=strokeparams)
für j = 2 zu Hubzählen
dx = Hubpunkte(j - 1) * 3) - Hubpunkte(j - 2) * 3)
dy = Hubpunkte(((j - 1) * 3) + 1) - Hubpunkte(((j - 2) * 3) + 1)
länge = länge + (dx ^ 2 + dy ^ 2) ^ 0,5
Nächste
Ende wählen
gesamtlänge = gesamtlänge + länge
Nächste
für i = 1 zu ifoldedgecount
Wählen Sie Fall objfoldedges(i). Geometrie. Typ
Falligline
rufen objfoldedges(i).getendpoints(startpoint:=dblstartpoint, endpoint:=dblendpoint)
Fall igcircle
' bestimmen, ob die Kante tatsächlich ein Kreis oder ein Bogen ist.
wenn objfoldedges(i).geschlossen dann
rufen objfoldedges(i).geometry.getcircledata(Mittepunkt:=dblcenter, Achsvektor:=dblnormal, Radius:=dblradius)
andere
call getarcdata(objfoldedges(i), true, dblcenter, dblnormal, dblstartpoint, dblendpoint, _
dblstartangle, dblsweepangle, dblmajoraxis, dblradius)
' den Startwinkel ändern, so dass er auf der Hauptachsenrichtung basiert. denn wir sind nur
"betreffend den Bogen in 2d Raum an der x-y Stelle sollte der Startwinkel relativ sein
' auf die x-Achse statt.
dblorigin(1) = 0
dblorigin(2) = 0
dblstartangle = dblstartangle + Lager(dblorigin, dblmajoraxis)
Ende
Fall igellipse, igbsplinecurve
' Schlag ellipsen und bspline Kurven.
rufen objfoldedges(i).getstrokedata(Toleranz:=0.001, Hubzähler:=Strokecount, Punkte:=Strokepoints, params:=strokeparams)
Ende wählen
Nächste
auf Fehlerwiederaufnahme
props("perimetro").value = Format(gesamtlänge, "0.000") & " m"
wenn er
props.add "perimetro", Format(gesamtlänge, "0.000") & " m"
Ende
Endteil