public sub avviocalcolocosto(tipo_lamiera comme chaîne, bshowresult comme booléen)
dim objfaces comme objet
dim objface comme objet
dim objtopfaces() en tant qu'objet
dim dblminrange(1 à 2) comme double
dim dblmaxrange(1 à 2) comme double
dim dblnormal(1 à 3) double: dim dblnormalref(1 à 3) double
dim itopfacecount comme entier
dim ioutlineedgecount comme entier
dim ifoldedgecount comme entier
dim objoutlineedges() en tant qu'objet
dim objfoldedges() comme objet
dim objedges comme objet
dim lgfacecount aussi longtemps
dim objsharedfaces(1 à 2) en tant qu'objet
dim isharedfaceindex en entier
dim i comme entier
dim j comme entier
dim k comme entier
dim ifilepointer comme entier
dim dblstartpoint(1 à 3) double
dim dblendpoint (1 à 3) comme double
dim dblcenter(1 à 3) double
dim dblradius double
dim dblstartangle double
dim dblsweepangle double
dim dblmajoraxis (1 à 3) comme double
dim duplicata sous forme de booléen
dim dblorigin (1 à 2) double
Dim nombre de coups aussi longtemps
dim points de course() en double
dim cardeparams() double
dim länge double
dim accessoires comme objet
Dim bite double
dim vars comme objet
dim rayon double
dim schnitt(15) double
dim dx double
dim dy comme double
suite de l'erreur
set objapp = getobject(, "solidedge.application")
en cas d'erreur alors
msgbox "sold edge deve essere aperto."
fin
fin si
en cas d'erreur aller à 0
si objapp.activeenvironment <> "feuillet métallique" alors
Msgbox "nessuna parte in lamiera aperta".
fin
fin si
set objfoldeddoc = objapp.activedocument
's'assurer que le document contient un modèle solide
si objfoldeddoc.models.count = 0 alors
msgbox "il fichier aperto non contiene un modello solido."
fin
fin si
définir objprops = objfoldeddoc.properties
nomefilexls = (gauche(objfoldeddoc.fullname, len(objfoldeddoc.fullname) - 4) + "_costo.xls")
_vecteur de la norme = 3
valeur_norme = 1
set objmodel = objflatdoc.reference.body.shells(1)
"Mettons tous les visages planaires dans le modèle.
'set objfaces = objmodel.body.faces(facetype:=igqueryplane)
set objfaces = objmodel.faces '(facetype:=igface)
' attribuez la mémoire pour stocker tous les visages supérieurs.
redim objtopfaces(1 to objfaces.count / 2) comme objet
' trouver et sauver toutes les faces dont la normale est dans l'axe positif z.
itopfacecount = 0
pour chaque objface en objfaces
' obtenir la gamme paramétrique du visage.
appel objface.getparamrange(minparam:=dblminrange, maxparam:=dblmaxrange)
' obtenir la normale au point de param min.
Appelez l'objface. getnormal(numparams:=1, params:=dblminrange, normales:=dblnormal)
' vérifier si elle est pointée dans la direction positive z.
si cstr(dblnormal(norm_vector)) = cstr(norm_value) alors
Sauvez ce visage parce que c'est un des visages supérieurs.
itopfacecount = itopfacecount + 1
set objtopfaces(itopfacecount) = objface
fin si
suivant
' de réserver de l'espace pour les bords
'redim objoutlineedges(1 à objmodel.body.edges(igqueryall).count / 3) comme objet
redim objoutlineedges(1 à objmodel.body.edges(igqueryall).count / 2) comme objet
si tipo_lamiera = "virola" alors
redim objfoldedges(2) comme objet
Autre
redim objfoldedges(1 to itopfacecount * 2) en tant qu'objet
fin si
dim ofoldedges comme collection
set ofoldedges = nouvelle collection
' initialiser les compteurs.
ioutlineedgecount = 0
ifoldedgecount = 0
' passer par les faces supérieures et recueillir tous les bords uniques. si des bords quelconques
' sont partagés par les faces supérieures, puis ils sont sauvés séparément comme bords de plis.
n_profili = 1
pour i = 1 à l'itopfacecount
' trovo i loop della faccia e li somo -1
n_profili = n_profili + objtopfaces(i).loops.count - 1
' obtenir tous les bords de la face actuelle.
set objedges = objtopfaces(i).edges
' vérifier chaque bord pour voir s'il est partagé avec un autre visage.
pour j = 1 à objedges. Nombre
' obtenir l'autre visage qui partage ce bord.
call objedges(j).getfaces(numfaces:=lgfacecount, faces:=objsharedfaces)
Prends l'autre visage.
si objsharedfaces(1) est objtopfaces(i) alors
isharedfaceindex = 2
Autre
isharedfaceindex = 1
fin si
' obtenir la gamme paramétrique du visage.
appel objsharedfaces(isharedfaceindex).getparamrange(minparam:=dblminrange, maxparam:=dblmaxrange)
' obtenir la normale au point de param min.
call objsharedfaces(isharedfaceindex).getnormal(numparams:=1, params:=dblminrange, normals:=dblnormal)
' si la normale pointe dans la direction positive z, le bord est partagé avec une autre face supérieure.
si abs(dblnormal(norm_vector)) > norm_value - 0,1 et dblnormal(norm_vector) < norm_value + 0,1 alors
' vérifier si ce bord est déjà pris en compte.
duplicata = faux
pour k = 1 à ifoldedgecount
si objedges(j) est objfoldedges(k) alors
duplication = true
sortie pour
fin si
suivant
si elle n'est pas dupliquée alors
'si itopfacecount * 2 < ifoldedgecount alors
ifoldedgecount = ifoldedgecount + 1
set objfoldedges(ifoldedgecount) = objedges(j)
oldedges.add (objedges(j))
'finir si
fin si
Autre
' le bord est à l'extérieur.
ioutlineedgecount = ioutlineedgecount + 1
set objoutlineedges(ioutlineedgecount) = objedges(j)
fin si
suivant
suivant
gesamtlänge = 0
pour i = 1 à ioutlineedgecount
länge = 0
sélectionner cas objoutlineedges(i).géométrie. type
cas igline
call objoutlineedges(i).getendpoints(startpoint:=dblstartpoint, endpoint:=dblendpoint)
'Länge der linie
Länge = ((dblendpoint(1) - dblstartpoint(1)) ^ 2 + (dblendpoint(2) - dblstartpoint(2)) ^ 2) ^ 0,5
cas igcircle
' déterminer si le bord est en fait un cercle ou un arc.
si objoutlineedges(i)est fermé alors
appel objoutlineedges(i).geométrie.getcircledata(point central:=dblcenter, axevecteur:=dblnormal, rayon:=dblradius)
länge = dblradius * 2 * pi
Autre
appel getarcdata(objoutlineedges(i), true, dblcenter, dblnormal, dblstartpoint, dblndpoint, _
dblstartangle, dblsweepangle, dblmajoraxis, dblradius)
' modifier l'angle de départ pour qu'il soit basé sur la direction de l'axe principal. puisque nous sommes seulement
' s'agissant de l'arc en espace 2d sur la place x-y, l'angle de départ devrait être relatif
' à la place de l'axe x.
dblorigine(1) = 0
dblorigine(2) = 0
dblstartangle = dblstartangle + roulement(dblorigine, dblmajoraxis)
länge = dblradius * dblsweepangle
fin si
cas igellipse, igbsplinecurve
• ellipses et courbes bspline.
call objoutlineedges(i).getstrokedata(tolérance:=0.001, nombre de temps:=compte de temps, points:=points de temps, paramètres:=params de temps)
pour j = 2 au nombre de courses
dx = points de course(j - 1) * 3) - points de course(j - 2) * 3)
dy = points de course(((j - 1) * 3) + 1) - points de course((j - 2) * 3) + 1)
länge = länge + (dx ^ 2 + dy ^ 2) ^ 0,5
suivant
fin de sélectionner
gesamtlänge = gesamtlänge + länge
suivant
pour i = 1 à ifoldedgecount
sélectionner le cas objfoldedges(i). géométrie. type
cas igline
call objfoldedges(i).getendpoints(startpoint:=dblstartpoint, endpoint:=dblendpoint)
cas igcircle
' déterminer si le bord est en fait un cercle ou un arc.
si objfoldedges(i)est fermé alors
appel objfoldedges(i).geométrie.getcircledata(point central:=dblcenter, axevecteur:=dblnormal, rayon:=dblradius)
Autre
appel getarcdata(objfoldedges(i), true, dblcenter, dblnormal, dblstartpoint, dblndpoint, _
dblstartangle, dblsweepangle, dblmajoraxis, dblradius)
' modifier l'angle de départ pour qu'il soit basé sur la direction de l'axe principal. puisque nous sommes seulement
' s'agissant de l'arc en espace 2d sur la place x-y, l'angle de départ devrait être relatif
' à la place de l'axe x.
dblorigine(1) = 0
dblorigine(2) = 0
dblstartangle = dblstartangle + roulement(dblorigine, dblmajoraxis)
fin si
cas igellipse, igbsplinecurve
• ellipses et courbes bspline.
call objfoldedges(i).getstrokedata(tolérance:=0.001, nombre de temps:=compte de temps, points:=points de temps, paramètres:=params de temps)
fin de sélectionner
suivant
suite de l'erreur
valeur = format(gesamtlänge, "0.000") & "m"
en cas d'erreur alors
accessoires.ajouter "perimetro", format(gesamtlänge, "0.000") & "m"
fin si
fin sous