PlannerRoad
Guest
su par l'interface c# code est disponible pour la compilation d'un utilitaire qui vous permet de créer simultanément un maillage polyédral à partir d'un ensemble de points 3d.
le code, pour, est le suivant:
la commande de l'utilitaire est sommaire.comment remplir le code: dans ce débat c# visuel: remplissez le code pour autocad j'ai expliqué la procédure et indiqué le logiciel pour compiler c#.
après avoir téléchargé l'utilitaire avec la commande netload, en donnant la commande triang, vous pouvez sélectionner un ensemble de points 3d et, à partir de la triangulation de ceux-ci, obtenir la maille polyhedra.
j'ai joint le code que j'ai compilé.
le code, pour, est le suivant:
PHP:
utilisation des services autodesk.autocad.application;
utilisation des services autodesk.autocad.database;
utilisant autodesk.autocad.runtime;
utilisant autodesk.autocad.editorinput;
utilisant autodesk.autocad.géométrie;
utilisation du système;
triangule de classe publique
{
la circonspection du sanglier public(
double x1, double y1, double x2,
double y2, double x3, double y3,
ref double xc, ref double yc, ref double r)
{
// calcul des coordonnées du cercle circonscrit et
// rayon carré
= 1e-6;
const double gros = 1e12;
bool result = true;
double m1, m2, mx1, mx2, my1, my2, dx, dy;
si ((math.abs(y1 - y2) < eps) && (math.abs(y2 - y3) < eps))
{
résultat = faux;
xc = x1; yc = y1; r = gros;
}
autre
{
si (math.abs(y2 - y1) < eps)
{
m2 = -(x3 - x2) / (y3 - y2);
mx2 = (x2 + x3) / 2;
my2 = (y2 + y3) / 2;
xc = (x2 + x1) / 2;
yc = m2 * (xc - mx2) + my2;
}
sinon si (math.abs(y3 - y2) < eps)
{
m1 = -(x2 - x1) / (y2 - y1);
mx1 = (x1 + x2) / 2;
my1 = (y1 + y2) / 2;
xc = (x3 + x2) / 2;
yc = m1 * (xc - mx1) + my1;
}
autre
{
m1 = -(x2 - x1) / (y2 - y1);
m2 = -(x3 - x2) / (y3 - y2);
si (mathe.abs(m1 - m2) < eps)
{
résultat = faux;
xc = x1;
yc = y1;
r = gros;
}
autre
{
mx1 = (x1 + x2) / 2;
mx2 = (x2 + x3) / 2;
my1 = (y1 + y2) / 2;
my2 = (y2 + y3) / 2;
xc = (m1 * mx1 - m2 * mx2 + my2 - my1) / (m1 - m2);
yc = m1 * (xc - mx1) + my1;
}
}
}
dx = x2 - xc;
dy = y2 - yc;
r = dx * dx + dy * dy;
le résultat du retour;
}
[CommandMethod("TRIANG")]vide public triangulacommand()
{
const int maxpoints = 32767;
document doc =
la gestion des documents.
base de données db = doc.database;
éditeur ed = doc.editor;
valeur[] tvs = { nouvelle valeur dactylographiée(0, "point") };
filtre de sélection sf =
nouveau filtre de sélection(tvs);
invitesselectionoptions pso = nouvelles invitesselectionoptions();
pso.messageforadding = "choisir des points:";
pso.allowduplicates = faux;
inviteselectionresult psr = ed.getselection(pso, sf);
si (psr.status) revient;
si (psr.status) revient;
ss de sélection = valeur psr;
int npts = ss.count;
si (npts < 3)
{
ed.writemessage("3 points minimum doivent être sélectionnés!");
retour;
}
si (npts > points maxi)
{
ed.writemessage("nuber maximum de points dépassés!");
retour;
}
i, j, k, ntri, ned, status1 = 0, status2 = 0;
le statut de bool;
// coordonnées des points
double[] ptx = nouveau double[maxpoints + 3];
double[] pty = nouveau double[maxpoints + 3];
double[] ptz = nouveau double[maxpoints + 3];
définition des triangles
int[] pt1 = nouvelle int[maxpoints * 2 + 1];
Int[] pt2 = nouvelle int[maxpoints * 2 + 1];
Int[] pt3 = nouvelle int[maxpoints * 2 + 1];
// cercle circonscrit
double[] cex = nouveau double[maxpoints * 2 + 1];
double[] cey = nouveau double[maxpoints * 2 + 1];
double[] rad = nouveau double[maxpoints * 2 + 1];
double xmin, ymin, xmax, ymax, dx, dy, xmid, ymid;
Int[] ed1 = nouvelle int[maxpoints * 2 + 1];
Int[] ed2 = nouvelle int[maxpoints * 2 + 1];
objet[] idarray = ss.getobjectids();
transaction tr =
db.transactionmanager.starttransaction();
utilisant (tr)
{
dbpoint ent;
k = 0;
pour (i = 0; i < npts; i++)
{
ent =
(dbpoint)tr.getobjet(idarray)[k], en mode ouvert.forread, plié);
ptx[i] = dépréciation[0];
pté[i] = dépréciation[1];
Ptz[i] = dépréciation[2];
Verser (j = 0; m <; j+)
au[i] == Ptx[j]) & (pty)[i] == pté[j]))
{
i--; npts--; status2++;
}
k++;
}
l'engagement();
}
si (état2 > 0)
ed.writemessage(
"\nignoré {0} point(s) avec les mêmes coordonnées."
statut2
);
// supertriangle
xmin = ptx[0]xmax = xmin;
= pty[0]ymax = ym;
i = 0; i < npts; i++
{}
(Ptx)[i] < xmin = ptx[i];
comme (ptx)[i] > xmax = ptx[i];
oui (p[i] < xmin) ymin = pty[i];
oui (p[i] > xmin) ymax = pty[i];
}
dx = xmax - xmin; dy = ymax - ymin;
xmid = (xmin + xmax) / 2; ymid = (ymin + ymax) / 2;
i = npts;
ptx[i] = xmid - (90 * (dx + dy)) - 100;
pté[i] = ymid - (50 * (dx + dy)) - 100;
Ptz[i] = 0;
pt1[0] = i.
i++;
ptx[i] = xmid + (90 * (dx + dy)) + 100;
pté[i] = ymid - (50 * (dx + dy)) - 100;
Ptz[i] = 0;
pt2[0] = i.
i++;
ptx[i] = xmid;
pté[i] = ymid + 100 * (dx + dy + 1);
Ptz[i] = 0;
pt3[0] = i;
tris = 1;
circum (
ptx[pt1[0]], pty[pt1[0]], ptx[pt2[0]les
pté[pt2[0]], ptx[pt3[0]], pty[pt3[0]les
ref cex[0], avis[0], ref rad[0]);
// Boucle principal
pour (i = 0; i < npts; i++)
{
ned = 0;
xmin = ptx[i]; ymin = pty[i];
j = 0;
(j < trois)
{
dx = cex[j] - xmin; dy = cey[j] - Ymin;
Si ((dx * dx) + (dy * dy)) < rad[j])
{
ed1[ned] = pt1[j]; ed2[ned] = pt2[j];
ned++;
ed1[ned] = pt2[j]; ed2[ned] = pt3[j];
ned++;
ed1[ned] = pt3[j]; ed2[ned] = pt1[j];
ned++;
_
pt[j] = pt1[ntri];
pt2[j] = pt2[ntri];
pt3[j] = pt3[ntri];
cex[j] = cex[ntri];
Cey[j] = cey[ntri];
rad[j] = roue[ntri];
J--;
♪ Je serai là ♪
j++;
♪ Je serai là ♪
pour (j = 0; j < down - 1; j++)
verser (k = j + 1; k < down; k++)
(d1[j] == éd2 ==[k]) & & (ed2[j] il s'agit d'un cas particulier.[k]))
{
ed1[j] = -1; ed2[j] = -1; ed1[k] = -1; ed2[k] = -1;
♪ Je serai là ♪
pour (j = 0; j < down; j++)
(d1[j] >= 0) && (ed2[j] > = 0)
♪
pt1[ntri] = ed1[j]; pt2[ntri] = ed2[j]; pt3[ntri] = i;
État =
circum(
ptx[pt1[ntri]], pty[pt1[ntri]], ptx[pt2[ntri]les
pté[pt2[ntri]], ptx[pt3[ntri]], pty[pt3[ntri]les
ref cex[ntri], avis[ntri], ref rad[ntri]);
si (!status)
{
statut1++;
}
ntri++;
}
}
// enlèvement des triangles extérieurs
i = 0;
alors que (i < ntri)
{
si (pt1[i] > npt)[i] > npt)[i] >= npts)
{
ntri--;
pt1[i] = pt1[ntri];
pt2[i] = pt2[ntri];
pt3[i] = pt3[ntri];
cex[i] = cex[ntri];
Cey[i] = cey[ntri];
rad[i] = roue[ntri];
i--;
}
i++;
}
tr = db.transactionmanager.starttransaction();
utilisant (tr)
{
blocktable bt =
(blocktable)tr.getobject(
blocktableid,
mode ouvert. à l'avance,
faux
);
blocktablerecord btr =
(blocktablerecord)tr.getobject(
bt[BlockTableRecord.ModelSpace],
mode ouvert. par écrit,
faux
);
polyfacemesh pfm = nouveau polyfacemesh();
annexe btr (pfm);
tr.addnewlycreateddbobject(pfm, true);
pour (i = 0; i < npts; i++)
{
polyfacemeshvertex vert =
nouveau polyfacemeshvertex(
nouveau point3d(ptx[i], pty[i], pt[i])
);
pfm.appendvertex(vert);
tr.addnewlycreateddbobject(vert, true);
}
pour (i = 0; i < ntri; i++)
{
face d'enregistrement =
nouveau enregistrement de la face(
(courte)pt1[i] + 1,
(applaudissements)[i] + 1,
(applaudissements)[i] + 1),
0
);
pfm.appendfacerecord(face);
tr.addnewlycreateddbobject(face, true);
}
l'engagement();
}
si (état1 > 0)
ed.writemessage(
"au secours ! {0} triangle(s) mince(s) trouvé(s)!" +
"un mauvais résultat possible!",
statut1
);
application.updatescreen();
}
}
après avoir téléchargé l'utilitaire avec la commande netload, en donnant la commande triang, vous pouvez sélectionner un ensemble de points 3d et, à partir de la triangulation de ceux-ci, obtenir la maille polyhedra.
j'ai joint le code que j'ai compilé.