Использования Вариативного массива для построения деталей

Автор NikSis, 31.10.18, 13:26:40

« предыдущая - следующая »

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

NikSis

Добрый день.
Сперва вкратце, в чем у меня заключается задача.
Есть 2 файла. В 1 содержится количество ребер и точки по которым строятся эти ребра. 2 количество граней и так же точки по которым они строятся. (это все в 3D моделировании).
Для построения ребер были использованы "отрезки по координатам", для построения граней "Заплатка".
Соответственно грань нельзя построить без 3 ребер, потому что Заплатка не выполниться, если нет замкнутого контура.
Это в принципе реализовано (код ниже), но по этому коду получается что он строит некоторые ребра по несколько раз, и за место (предположим) 1100 ребер, он строит 4000+ ребер. И соответственно само выполнение построения сетки увеличивается в разы.

for (int i = 0; i < e; i++)
{
int x01 = r[i][1];
int x02 = r[i][2];
int x03 = r[i][3];
int x0 = y[x01][1];
int y0 = y[x01][2];
int z0 = y[x01][3];
int x1 = y[x02][1];
int y1 = y[x02][2];
int z1 = y[x02][3];
int x2 = y[x03][1];
int y2 = y[x03][2];
int z2 = y[x03][3];

ksEntityPtr t = part->NewEntity(o3d_LineSegment3D);
t->Create();
ILineSegment3DPtr p1 = kompas->TransferInterface(t, ksAPI7Dual, 0);
p1->BuildingType = ksLSTTwoPoints;
p1->SetPoint(true, x0, y0, z0);
p1->SetPoint(false, x1, y1, z1);
p1->Hidden = true;
p1->Update();

ksEntityPtr t1 = part->NewEntity(o3d_LineSegment3D);
t1->Create();
ILineSegment3DPtr p2 = kompas->TransferInterface(t1, ksAPI7Dual, 0);
p2->BuildingType = ksLSTTwoPoints;
p2->SetPoint(true, x1, y1, z1);
p2->SetPoint(false, x2, y2, z2);
p2->Hidden = true;
p2->Update();

ksEntityPtr t2 = part->NewEntity(o3d_LineSegment3D);
t2->Create();
ILineSegment3DPtr p3 = kompas->TransferInterface(t2, ksAPI7Dual, 0);
p3->BuildingType = ksLSTTwoPoints;
p3->SetPoint(true, x2, y2, z2);
p3->SetPoint(false, x0, y0, z0);
p3->Hidden = true;
p3->Update()

ksEntityPtr l = part->NewEntity(o3d_SurfacePatch);
l->Create();
ISurfacePatchPtr p4 = kompas->TransferInterface(l, ksAPI7Dual, 0);
_variant_t Gran;
VariantInit(&Gran);
SAFEARRAYBOUND sabNewArray1;
SAFEARRAY * pSafe = NULL;
sabNewArray1.cElements = 3;
sabNewArray1.lLbound = 0;
pSafe = ::SafeArrayCreate(VT_DISPATCH, 1, &sabNewArray1);
LPDISPATCH disp;
long j;
disp = (LPDISPATCH)p1;
j = 0;
::SafeArrayPutElement(pSafe, (long*)&j, (void*)disp);
disp = (LPDISPATCH)p2;
j = 1;
::SafeArrayPutElement(pSafe, (long*)&j, (void*)disp);
disp = (LPDISPATCH)p3;
j = 2;
::SafeArrayPutElement(pSafe, (long*)&j, (void*)disp);
V_VT(&Gran) = VT_ARRAY | VT_DISPATCH;
V_ARRAY(&Gran) = pSafe;
p4->Edges = Gran;
p4->Update();
}


Была идея построения сперва всех ребер (и записывая их в Вариантный массив), а уже потом, вытаскивая необходимые ребра - строить грани.

Построение ребер, с заполнением массива.
for (int i = 0; i < q; i++)
{
int x01 = w[i][1];
int x0 = y[x01][1];
int y0 = y[x01][2];
int z0 = y[x01][3];
int x02 = w[i][2];
int x1 = y[x02][1];
int y1 = y[x02][2];
int z1 = y[x02][3];

        ksEntityPtr t = part->NewEntity(o3d_LineSegment3D);
t->Create();
ILineSegment3DPtr p6 = kompas->TransferInterface(t, ksAPI7Dual, 0);
p6->BuildingType = ksLSTTwoPoints;
p6->SetPoint(true, x0, y0, z0);
p6->SetPoint(false, x1, y1, z1);
p6->Update();

_variant_t Reb;
VariantInit(&Reb);
SAFEARRAYBOUND sabNewArray2;
SAFEARRAY * pSafe1 = NULL;
sabNewArray2.cElements = q;
sabNewArray2.lLbound = 0;
pSafe1 = ::SafeArrayCreate(VT_DISPATCH, 1, &sabNewArray2);
LPDISPATCH disp1;
long k;
disp1 = (LPDISPATCH)p6;
k = i;
::SafeArrayPutElement(pSafe1, (long*)&k, (void*)disp1);
        V_VT(&Reb) = VT_ARRAY | VT_DISPATCH;
V_ARRAY(&Reb) = pSafe1
}


Построение граней
for (int i = 0; i < e; i++)
{
       ksEntityPtr l = part->NewEntity(o3d_SurfacePatch);
l->Create();
ISurfacePatchPtr p4 = kompas->TransferInterface(l, ksAPI7Dual, 0);
_variant_t Gran;
VariantInit(&Gran);
SAFEARRAYBOUND sabNewArray1;
SAFEARRAY * pSafe = NULL;
sabNewArray1.cElements = 3;
sabNewArray1.lLbound = 0;
pSafe = ::SafeArrayCreate(VT_DISPATCH, 1, &sabNewArray1);
LPDISPATCH disp;
long j;
disp = (LPDISPATCH)?????????????;
j = 0;
::SafeArrayPutElement(pSafe, (long*)&j, (void*)disp);
disp = (LPDISPATCH)?????????????;
j = 1;
::SafeArrayPutElement(pSafe, (long*)&j, (void*)disp);
disp = (LPDISPATCH)?????????????;
j = 2;
::SafeArrayPutElement(pSafe, (long*)&j, (void*)disp);
V_VT(&Gran) = VT_ARRAY | VT_DISPATCH;
V_ARRAY(&Gran) = pSafe;
p4->Edges = Gran;
p4->Update();
}


Но как обратиться к нужному элементу Вариативного массива, я не понимаю.
Может кто подскажет как обратиться например к 0,1 и 6 элементам этого массива.
Или может кто нибудь предложит другой способ уменьшения времени построения сетки?
Заранее спасибо.