Создание ломаной линии по трем координатам

Автор NikSis, 01.11.18, 16:02:45

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

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

NikSis

01.11.18, 16:02:45 Последнее редактирование: 01.11.18, 16:32:51 от NikSis
Не понимаю что не так. Применял IPolyLine. Вроде сделал все как в SDK написано, 2 массива - массив координат точек и массив радиусов.
Применил GetVertexCoordinatesArra, но при попытке запустить в Компасе, сам компас вылетает. (все координаты такие что ломаная делает треугольник)
Подскажите пожалуйста, что не так


int x01 = r[i][1]; 
int x02 = r[i][2]; 
int x03 = r[i][3]; 

int x0 = y[x01][1]; int r0 = 0;
int y0 = y[x01][2]; int r1 = 0;
int z0 = y[x01][3]; int r2 = 0;
int x1 = y[x02][1]; int r3 = 0;
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];

_variant_t Coord;
VariantInit(&Coord);
SAFEARRAYBOUND sabNewArray2;
SAFEARRAY * pSafe2 = NULL;
sabNewArray2.cElements = 12;
sabNewArray2.lLbound = 0;
pSafe2 = ::SafeArrayCreate(VT_R8, 1, &sabNewArray2);
LPDISPATCH disp2;
long j;
disp2 = (LPDISPATCH)x0;
j = 0;
::SafeArrayPutElement(pSafe2, (long*)&j, (void*)disp2);
disp2 = (LPDISPATCH)y0;
j = 1;
::SafeArrayPutElement(pSafe2, (long*)&j, (void*)disp2);
disp2 = (LPDISPATCH)z0;
j = 2;
::SafeArrayPutElement(pSafe2, (long*)&j, (void*)disp2);
disp2 = (LPDISPATCH)x1;
j = 3;
::SafeArrayPutElement(pSafe2, (long*)&j, (void*)disp2);
disp2 = (LPDISPATCH)y1;
j = 4;
::SafeArrayPutElement(pSafe2, (long*)&j, (void*)disp2);
disp2 = (LPDISPATCH)z1;
j = 5;
::SafeArrayPutElement(pSafe2, (long*)&j, (void*)disp2);
disp2 = (LPDISPATCH)x2;
j = 6;
::SafeArrayPutElement(pSafe2, (long*)&j, (void*)disp2);
disp2 = (LPDISPATCH)y2;
j = 7;
::SafeArrayPutElement(pSafe2, (long*)&j, (void*)disp2);
disp2 = (LPDISPATCH)z2;
j = 8;
::SafeArrayPutElement(pSafe2, (long*)&j, (void*)disp2);
disp2 = (LPDISPATCH)x0;
j = 9;
::SafeArrayPutElement(pSafe2, (long*)&j, (void*)disp2);
disp2 = (LPDISPATCH)y0;
j = 10;
::SafeArrayPutElement(pSafe2, (long*)&j, (void*)disp2);
disp2 = (LPDISPATCH)z0;
j = 11;
::SafeArrayPutElement(pSafe2, (long*)&j, (void*)disp2);
V_VT(&Coord) = VT_ARRAY | VT_R8;
V_ARRAY(&Coord) = pSafe2;

_variant_t Rad;
VariantInit(&Rad);
SAFEARRAYBOUND sabNewArray3;
SAFEARRAY * pSafe3 = NULL;
sabNewArray3.cElements = 4;
sabNewArray3.lLbound = 0;
pSafe3 = ::SafeArrayCreate(VT_R8, 1, &sabNewArray3);
LPDISPATCH disp3;
long j1;
disp3 = (LPDISPATCH)r0;
j1 = 0;
::SafeArrayPutElement(pSafe3, (long*)&j1, (void*)disp3);
disp3 = (LPDISPATCH)r1;
j1 = 1;
::SafeArrayPutElement(pSafe3, (long*)&j1, (void*)disp3);
disp3 = (LPDISPATCH)r2;
j1 = 2;
::SafeArrayPutElement(pSafe3, (long*)&j1, (void*)disp3);
disp3 = (LPDISPATCH)r3;
j1 = 3;
::SafeArrayPutElement(pSafe3, (long*)&j1, (void*)disp3);
V_VT(&Rad) = VT_ARRAY | VT_R8;
V_ARRAY(&Rad) = pSafe3;

ksEntityPtr t = part->NewEntity(o3d_polyline);
t->Create();
IPolyLinePtr p1 = kompas->TransferInterface(t, ksAPI7Dual, 0);
p1->GetVertexCoordinatesArray(&Coord,&Rad);
p1->Update();


Заранее спасибо.

Sabahs

Достаточно двух отрезков и свойство Closed.

NikSis

Цитата: Sabahs от 01.11.18, 16:11:27
Достаточно двух отрезков и свойство Closed.


Это упрощает конечно программу, но проблему не решает. Ломаные так и не строятся.

Sabahs

Зачем через массивы, используйте AddVertex - создать новую вершину.

NikSis

Цитата: Sabahs от 01.11.18, 16:57:39
Зачем через массивы, используйте AddVertex - создать новую вершину.


У PolyLine метод AddVertex нужно указывать Index (Синтаксис Automation: LPDISPATCH AddVertex( long Index );).
Как я понимаю Index это уже какая та построенная точка, или я понял не так? Но это точно не построение по координатам.
А необходимо именно построение ломаных по координатам, я и нашел единственный вариант - через массивы, но и он не работает :(

Sabahs

Всё там работает.