Построение точки по 3 координатам

Автор NikSis, 24.10.18, 14:19:09

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

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

NikSis

Добрый день. Облазил весь SDK и все step пересмотрел, но нашел только построение точки по 2 координатам.
А в Компасе в "Твердотельном моделировании" есть операция "точка по координатам" которая задается именно координатами x, y, z. Может кто знает как эта операция реализовывается в C++?

ТрындецЪ



NikSis

Цитата: Sabahs от 24.10.18, 14:25:12
http://forum.ascon.ru/index.php/topic,25251.msg183201.html#msg183201


Взял пример построения из этой темы.

IPoint3DPtr CreatePoint(IKompasDocumentPtr & doc, double a, double b, double r, wstring name = NULL)
{
IPoint3DPtr newPoint = NULL;
// Получаем 3D документ
IKompasDocument3DPtr doc3D(doc);
IPart7Ptr part(doc3D->TopPart);
if (part)
{
// Получаем контейнер модельных объектов
IModelContainerPtr modelCont(GetModelContainer(doc));

if (modelCont)
{
// Получаем коллекцию точек
IPoints3DPtr pointsColl(modelCont->GetPoints3D());

if (pointsColl)
{
// Добавляем новую точку
newPoint = pointsColl->Add();

if (newPoint)
{
// Задаем параметры точки
//newPoint->put_Name((BSTR)name.c_str());
newPoint->Symbol = ksStrikeSquarePoint;
newPoint->ParameterType = ksPSphericCoord;
IPoint3DParamBySpherePtr param = newPoint->Parameters;
param->A = 4;
param->B = 4;
param->R = 4;
newPoint->Update();
}
}
}
}
return newPoint;
}


Но так и не понял некоторые вещи.
В этом примере точка задана сферическими координатами (как поменять на цилиндрические я нашел), а вот как поменять на "прямоугольные", что бы задавалось x, y, z я так и не нашел.

В добавок выдало ошибку



Как и где определить  "GetModelContainer" я не понял.

И если не сложно, объясните для чего вот это "wstring name = NULL"

ZorGR

Вот так можно:
Цитироватьif (!part)
      return NULL;

   ksEntityPtr p = part->NewEntity(o3d_point3D);
   p->Create();

   IPoint3DPtr p7 = kompas5->TransferInterface(p, ksAPI7Dual, 0);

   p7->X = point.x;
   p7->Y = point.y;
   p7->Z = point.z;
   p7->Name = name.toStdWString().c_str();
   p7->Update();   

NikSis

Извиняюсь сразу за глупые вопросы, я немножко глуповат и С++ только недавно начал изучать.
Если использовать этот код, то не определяет "name", "kompas5". И тут аналогично, не знаю даже как их определить.


ZorGR

NikSis, реально сложно вам чем-либо помочь.
1) Вам необходимо освоить хотя-бы один самоучитель по c++.
2) Разберитесь с примерами применения API КОМПАС (идут в комплекте с КОМПАС).
3) Научитесь пользоваться документацией к API (идет в комплекте с КОМПАС).

NikSis

Цитата: ZorGR от 25.10.18, 12:23:44
NikSis, реально сложно вам чем-либо помочь.
1) Вам необходимо освоить хотя-бы один самоучитель по c++.
2) Разберитесь с примерами применения API КОМПАС (идут в комплекте с КОМПАС).
3) Научитесь пользоваться документацией к API (идет в комплекте с КОМПАС).


У меня уже написана библиотека для Компаса, которая строит детали и производит необходимый расчет. И все это благодаря как рас таки этим самым примерам, которые идут с Компасом. И я каждую строчку в своей программе понимаю.
Но в этих самых примерах нет ни слова про построение точек по 3 координатам.
А то что написано в документации, я до сих пор не понимаю, даже те аспекты которые уже разобрал на примерах.
По этому я и пишу здесь на форуме, в надежде увидеть пример построения, а модифицировать и подстроить под свою программу я смогу.

ZorGR

KompasObjectPtr kompas5 - инициализируется при запуске библиотеки.
ksPartPtr part = kompas5->ActiveDocument3D()->GetPart(pTop_Part)
name.toStdWString().c_str() - это bstr_t, можно заменить на "";

NikSis

Спасибо огромное, разобрался, заработало.

NikSis

Даже стыдно уже писать :)
Возник вопрос, вытекающий из вышеуказанного вопроса.
В Компасе в "Каркас и поверхности" есть "Отрезок по координатам" (который строит отрезок либо по точкам привязки, либо по координатам x, y, z). Аналогично ни в step, ни SDC найти не могу.
Может подскажите?
(за одно и с "Заплатка" аналогично)
Буду при очень благодарен.

Sabahs

if pPart7<>nil then pAuxiliaryGeomContainer:=pPart7 as IAuxiliaryGeomContainer;
if pAuxiliaryGeomContainer<>nil then pLineSegments3D:=pAuxiliaryGeomContainer.LineSegments3D;
if pLineSegments3D<>nil then pLineSegment3D:=pLineSegments3D.Add;
if pLineSegment3D<>nil then
begin
   pLineSegment3D.BuildingType:=ksLSTTwoPoints;
   pLineSegment3D.SetPoint(True,XR1,YR1,ZR1);
   pLineSegment3D.SetPoint(False,XR2,-YR2,ZR2);
   pLineSegment3D.Update;
end;

NikSis

Sabahs, спасибо огромное.
А по "Заплатка" у вас есть что нибудь?

Sabahs

Может новую тему создадите, а то лепете всё в одной.