استفاده از انتخاب ها برای ویرایش اجسام هندسی

استفاده از انتخاب ها برای ویرایش اجسام هندسی

استفاده از انتخاب ها برای ویرایش اجسام هندسی
روش زیر صفحه ای با آرایه ای از استوانه ها را تولید می کند. سیلندرها ممکن است به عنوان مثال در عملیات تفاضلی برای ایجاد مجموعه ای از سوراخ ها در صفحه استفاده شوند.
GeomSequence geom = model.component(“comp1”).geom(“geom1”);
geom.create(“blk1″، “Block”);
geom.feature(“blk1”).set(“size”, new int[]{10, 10, 1});
geom.create(“start_cyl1”, “Cylinder”);
geom.feature(“start_cyl1”).set(“pos”, new double[]{2.5, 2.5, 0});
geom.create(“arr1″، “Array”);
geom.feature(“arr1”).selection(“input”).set(“start_cyl1”);
geom.feature(“arr1”).set(“fullsize”, new int[]{2, 2, 1});
geom.feature(“arr1”).set(“displ”, new int[]{5, 5, 0});
geom.run(“arr1”);
هندسه حاصل در شکل زیر نشان داده شده است.
اکنون فرض کنید که هندسه حاصل از مرحله قبل، با یک شی هندسی وارد شده مطابقت دارد و می‌خواهید قبل از تفریق و ایجاد سوراخ، استوانه‌ها را با استوانه‌های بزرگ‌تر جایگزین کنید. علاوه بر این، فرض کنید که اجسام استوانه ای توسط یک نرم افزار خارجی به گونه ای تولید می شوند که، اگرچه می دانید این اشیاء استوانه ای هستند، اما به عنوان اجسام هندسی عمومی بدون اطلاعات در مورد شعاع، ارتفاع یا موقعیت نمایش داده می شوند. روش زیر آرایه استوانه‌ها را پیدا می‌کند، اطلاعات مختصات هر استوانه را استخراج می‌کند، استوانه‌ها را حذف می‌کند، آرایه جدیدی از استوانه‌های وسیع‌تر ایجاد می‌کند و در نهایت استوانه‌ها را از صفحه کم می‌کند. هندسه حاصل در شکل زیر نشان داده شده است.
این روش نمونه ای از بازیابی نام اجسام هندسی، اطلاعات مختصات و استفاده از انتخاب ها است. برای شروع از یک شی هندسی دیگر (که الزاماً صفحه ای با استوانه است)، می توانید برچسب رشته را در متغیر plateAndCylinders جایگزین کنید.
double selTol = 1e-2; // Selection tolerance
double newR = 1.25; // New cylinder radius
double newH = 1; // New cylinder height
double plateThickness = 1; // Plate thickness
String plateAndCylinders = “arr1”;
// Update and split geometry
model.component(“comp1”).geom(“geom1”).run(“fin”);
GeomSequence geom = model.component(“comp1”).geom(“geom1”);
geom.run(plateAndCylinders);
geom.create(“spl1”, “Split”);
geom.feature(“spl1”).selection(“input”).set(plateAndCylinders);
geom.run(“spl1”);
// Find extents of geometry in x,y,z directions
double[] bBox = geom.getBoundingBox();
double MinX = bBox[0];
double MaxX = bBox[1];
double MinY = bBox[2];
double MaxY = bBox[3];
double MinZ = bBox[4];
double MaxZ = bBox[5];
// Define scaled coordinate tolerance
double scale = Math.max(Math.max(MaxX-MinX, MaxY-MinY), MaxZ-MinZ);
double scaleSelTol = scale*selTol;
// Create box selection based on geometry extents
geom.create(“boxsel1”, “BoxSelection”);
with(geom.feature(“boxsel1”));
  // Select boundaries inside box in X-Y direction using tolerance
  set(“xmin”, MinX+scaleSelTol);
  set(“xmax”, MaxX-scaleSelTol);
  set(“ymin”, MinY+scaleSelTol);
  set(“ymax”, MaxY-scaleSelTol);
  set(“zmin”, MinZ-scaleSelTol);
  set(“zmax”, MaxZ+scaleSelTol);
  set(“condition”, “inside”);
  set(“entitydim”, -1); // Select objects
endwith();
geom.run(“boxsel1”);
// Get object names
String[] so = geom.selection(“boxsel1”).objects();
int nso = so.length;
// Extract cylinder parameters
double[] MinXC = new double[nso];
double[] MaxXC = new double[nso];
double[] MinYC = new double[nso];
double[] MaxYC = new double[nso];
double[] MinZC = new double[nso];
double[] MaxZC = new double[nso];
double[] bBoxC = new double[6];
for (int i = 0; i < nso; i++) {
  bBoxC = geom.obj(so[i]).getBoundingBox();
  MinXC[i] = bBoxC[0];
  MaxXC[i] = bBoxC[1];
  MinYC[i] = bBoxC[2];
  MaxYC[i] = bBoxC[3];
  MinZC[i] = bBoxC[4];
  MaxZC[i] = bBoxC[5];
}
double[] radius = new double[nso];
double[] xc = new double[nso];
double[] yc = new double[nso];
double[] zc = new double[nso];
double[] hc = new double[nso];
double ry;
double tol = scale*1e-6; // Tolerance check for skew cylinders, optional consistency check
for (int i = 0; i < nso; i++) {
  xc[i] = (MaxXC[i]+MinXC[i])/2;
  yc[i] = (MaxYC[i]+MinYC[i])/2;
  zc[i] = (MaxZC[i]+MinZC[i])/2;
  hc[i] = MaxZC[i]-MinZC[i];
  radius[i] = (MaxXC[i]-MinXC[i])/2;
  ry = (MaxYC[i]-MinYC[i])/2;
  if (Math.abs(radius[i]-ry) > tol)
    error(“Object is not a circular cylinder.”);
}
// Delete all cylinder objects
geom.create(“del1”, “Delete”);
geom.feature(“del1”).selection(“input”).init();
geom.feature(“del1”).selection(“input”).set(so);
geom.run(“del1”);
// Add new cylinders
String[] cylname = new String[nso];
for (int i = 0; i < nso; i++) {
  cylname[i] = “cyl”+toString(i+1);
  geom.create(cylname[i], “Cylinder”);
  with(geom.feature(cylname[i]));
    set(“r”, newR);
    set(“h”, newH+2*scaleSelTol);
    set(“pos”, new double[]{xc[i], yc[i], plateThickness-2*zc[i]-scaleSelTol});
  endwith();
}
// Combine all cylinders into one object
geom.create(“uni1”, “Union”);
geom.feature(“uni1”).selection(“input”).set(cylname);
geom.run(“uni1”);
// Difference between all objects and cylinders
geom.create(“dif1”, “Difference”);
String[] objs = geom.objectNames();
geom.feature(“dif1”).selection(“input”).set(objs);
geom.feature(“dif1”).selection(“input2”).set(“uni1”);
geom.run(“dif1”);
نظرات
این روش فرض می‌کند که اجسام هندسه ورودی ساختاری مشابه با صفحه با استوانه مثال بالا دارند. توجه داشته باشید که برای پاک کردن دنباله هندسی می توانید یک متد با خط ایجاد کنید
model.component(“comp1”).geom(“geom1”).feature().clear();
اگر روش اصلی را به طور مکرر از بالا اجرا می کنید، می تواند مفید باشد، زیرا باید قبل از هر اجرا، دنباله هندسه را پاک کنید.
اولین خط
geom.feature(“del1”).selection(“input”).init();
geom.feature(“del1”).selection(“input”).set(so);
انتخاب را به صورت خالی از نوع شی مقداردهی اولیه می کند. سپس خط دوم تمام اشیاء با نام در آرایه را انتخاب می کند . به طور کلی، فراخوانی به init() بدون آرگومان ورودی به این معنی است که انتخاب برای اشیا و init(n) است که در آن n = 0 ، 1 ، 2 یا 3 به این معنی است که انتخاب برای نقاط، لبه ها، وجه ها و دامنه ها به ترتیب توجه داشته باشید که در برخی موارد n = -1 برای نشان دادن سطح شی (به جای آرگومان ورودی خالی) استفاده می شود. به کتابچه راهنمای مرجع برنامه نویسی مراجعه کنید.
شکل زیر نمونه ای را بر اساس آرایه بزرگتری از سیلندرها نشان می دهد.