ksTrimCurve

Автор Гость форума, 04.05.09, 14:28:32

« назад - далее »

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

Гость форума

Подскажите пожалуйста как определить "указатель на усекаемую кривую" для функции ksTrimCurve.
Или посоветуйте пожалуйста, если есть, другой вариант для усечения линии до пересечения с другой линией.
Заранее спасибо за ответ.

prog1

Оставляю кусок эллипса между линиями:
       L12:=doc.ksLineSeg(Pt1.x,Pt1.y,Pt2.x,Pt2.y,11);
       L34:=doc.ksLineSeg(Pt3.x,Pt3.y,Pt4.x,Pt4.y,11);
       parE.A:=D/2; parE.B:=hn;
       El3:=Doc.ksEllipseArc(parE);
       If Mat.ksIntersectCurvCurv(L12,El3,DynArray)=1 then begin
       DynArray.ksGetArrayItem(0,Point);
       Pt5.y:=Point.y; Pt5.x:=Point.x;   DynArray.ksClearArray; end;
       If Mat.ksIntersectCurvCurv(L34,El3,DynArray)=1 then begin
       DynArray.ksGetArrayItem(0,Point);
       Pt6.y:=Point.y; Pt6.x:=Point.x;   DynArray.ksClearArray; end;
       El3:=Doc.ksTrimmCurve(El3,Pt5.x,Pt5.y,Pt6.x,Pt6.y,Pt5.x,Pt5.y,1);
Каждой линии даю указатель, чтоб легко было с ними обращаться.

1. Можно обойтись без Trimm: Нашли точку пересечения Mat.ksIntersectCurvCurv, и от неё рисуете свой LineSeg.
2. Можно обойтись без Mat.ksIntersectCurvCurv: Решаете математические уравнения своих линий, находите точку пересечения, и от неё рисуете свой LineSeg (это будет быстрее отрабатывать: Компас-математика тяжеловата)
Удачи!




Гость форума

Цитата: prog1 от 04.05.09, 15:56:05
Оставляю кусок эллипса между линиями:
       L12:=doc.ksLineSeg(Pt1.x,Pt1.y,Pt2.x,Pt2.y,11);
       L34:=doc.ksLineSeg(Pt3.x,Pt3.y,Pt4.x,Pt4.y,11);
       parE.A:=D/2; parE.B:=hn;
       El3:=Doc.ksEllipseArc(parE);
       If Mat.ksIntersectCurvCurv(L12,El3,DynArray)=1 then begin
       DynArray.ksGetArrayItem(0,Point);
       Pt5.y:=Point.y; Pt5.x:=Point.x;   DynArray.ksClearArray; end;
       If Mat.ksIntersectCurvCurv(L34,El3,DynArray)=1 then begin
       DynArray.ksGetArrayItem(0,Point);
       Pt6.y:=Point.y; Pt6.x:=Point.x;   DynArray.ksClearArray; end;
       El3:=Doc.ksTrimmCurve(El3,Pt5.x,Pt5.y,Pt6.x,Pt6.y,Pt5.x,Pt5.y,1);
Каждой линии даю указатель, чтоб легко было с ними обращаться.

1. Можно обойтись без Trimm: Нашли точку пересечения Mat.ksIntersectCurvCurv, и от неё рисуете свой LineSeg.
2. Можно обойтись без Mat.ksIntersectCurvCurv: Решаете математические уравнения своих линий, находите точку пересечения, и от неё рисуете свой LineSeg (это будет быстрее отрабатывать: Компас-математика тяжеловата)
Удачи!
А какой тип у переменной L12?

Prog2

Цитата: Гость форума от 04.05.09, 16:17:49
А какой тип у переменной L12?
Дыксь, это длинное целое, является по сути идентификатором объекта (отрезка в данном случае). Например, reference или long (возможно, в делфи integer), на Ваш выбор ;)

Гость форума

Цитата: Prog2 от 04.05.09, 22:36:16
Цитата: Гость форума от 04.05.09, 16:17:49
А какой тип у переменной L12?
Дыксь, это длинное целое, является по сути идентификатором объекта (отрезка в данном случае). Например, reference или long (возможно, в делфи integer), на Ваш выбор ;)
Подскажите пожалуйста, что не так? прямая пересекается с дугой, пытаюсь написать такую процедуру чтоб определять точку пересечения и отрезать лишнее:
procedure cutcut(x1,y1,x2,y2,xc,yc,rad,f1,f2:real;direct:smallint;obj:reference);
var
    cut        : ksCutLineParam;
    tMathPoint : ksMathPointParam;
    pMathPoint : ksDynamicArray;
    mat        : ksMathematic2D;
    xx,yy:real;
begin
    tMathPoint := ksMathPointParam( kompas.GetParamStruct(ko_MathPointParam) );
    tMathPoint.Init;
If mat.ksIntersectLinSArc(x1,y1,x2,y2,xc,yc,rad,f1,f2,direct,pMathPoint) then !!!ругается тут!!!
begin
  pMathPoint.ksGetArrayItem(0,tMathPoint);
  yy:=tMathPoint.Y;
  xx:=tMathPoint.X;
  pMathPoint.ksClearArray;
end;
Doc.ksTrimmCurve(obj,x1,y1,xx,yy,x1,y1,1);
end;

prog1

А корректны ли передаваемые параметры в процедуру (т.е. по ним реально можно построить дугу?)? Строка, что у Вас ругается, у меня -  без ошибок.
Я предлагаю Вам вариант: If mat.ksIntersectCurvCurv(Obj1,Obj2,DynArray)=1, тем более, что Obj1 Вы передаете в процедуру. Obj2:=ksLineSeg(x1,y1,x2,y2,1).
Выведите контрольный флажок(message) после отрисовки объектов, чтобы убедиться в верности отрисовки. А также выведите что возвращает .ksIntersectCurvCurv (0/1).
ВсЁ. Удачи!

prog1

Ещё: внесите ksTrimmCurve(obj,x1,y1,xx,yy,x1,y1,1) в oператорные скобки begin - end oт If intersect (т.е. обрезать только если есть пересечение) - но это мелочи. Удачи!

Гость форума

Цитата: prog1 от 08.05.09, 09:25:58
А корректны ли передаваемые параметры в процедуру (т.е. по ним реально можно построить дугу?)? Строка, что у Вас ругается, у меня -  без ошибок.
Я предлагаю Вам вариант: If mat.ksIntersectCurvCurv(Obj1,Obj2,DynArray)=1, тем более, что Obj1 Вы передаете в процедуру. Obj2:=ksLineSeg(x1,y1,x2,y2,1).
Выведите контрольный флажок(message) после отрисовки объектов, чтобы убедиться в верности отрисовки. А также выведите что возвращает .ksIntersectCurvCurv (0/1).
ВсЁ. Удачи!
Компиляция то проходит, а вот на моменте выполнения ошибка "исключения".
Не могли бы подробнее рассказать о инициализации DynArray в строке
If mat.ksIntersectCurvCurv(Obj1,Obj2,DynArray)=1
я подозреваю что ошибка именно в этом.

prog1

Попробуйте вставить этот кусок кода и взгляните как отрабатывает:
procedure pr_InterStep(Obj1,Obj2:Reference);
var DynArray:ksDynamicArray;   
    Point  :ksMathPOintParam;
begin
DynArray:=ksDynamicArray(Kompas.GetDynamicArray(POINT_ARR));  if DynArray=nil then exit;
Point:=ksMathPointParam(Kompas.GetParamStruct(14));
  If Mat.ksIntersectCurvCurv(Obj1,Obj2,DynArray)=1 then begin   
  If DynArray.ksGetArrayCount()=2 then begin // 2 точки пересеч
   DynArray.ksGetArrayItem(0,Point);   Inter1[i-1]:=Point.y;
   DynArray.ksGetArrayItem(1,Point);   Inter1:=Point.y;
   DynArray.ksClearArray; End;End;
-----------------
Удачи!

Гость форума

Цитата: prog1 от 08.05.09, 10:15:45
Попробуйте вставить этот кусок кода и взгляните как отрабатывает:
procedure pr_InterStep(Obj1,Obj2:Reference);
var DynArray:ksDynamicArray;   
    Point  :ksMathPOintParam;
begin
DynArray:=ksDynamicArray(Kompas.GetDynamicArray(POINT_ARR));  if DynArray=nil then exit;
Point:=ksMathPointParam(Kompas.GetParamStruct(14));
  If Mat.ksIntersectCurvCurv(Obj1,Obj2,DynArray)=1 then begin   
  If DynArray.ksGetArrayCount()=2 then begin // 2 точки пересеч
   DynArray.ksGetArrayItem(0,Point);   Inter1[i-1]:=Point.y;
   DynArray.ksGetArrayItem(1,Point);   Inter1:=Point.y;
   DynArray.ksClearArray; End;End;
-----------------
Удачи!
Получилось так:
procedure cutcut(x1,y1:real;obj,obj1:reference);
var
   tMathPoint : ksMathPointParam;
   DynArray   : ksDynamicArray;
   mat        : ksMathematic2D;
   arr        : reference;
   xx,yy:real;
begin
   tMathPoint := ksMathPointParam( kompas.GetParamStruct(ko_MathPointParam) );
   tMathPoint.Init;
   DynArray:=ksDynamicArray(Kompas.GetDynamicArray(POINT_ARR));
   mat:=ksMathematic2D( Kompas.Document2D );
If mat.ksIntersectCurvCurv(obj,obj1,DynArray)=1 then //!!!Вот тут ошибка : несовместимость типов!!!
begin
 DynArray.ksGetArrayItem(0,tMathPoint);
 yy:=tMathPoint.Y;
 xx:=tMathPoint.X;
 DynArray.ksClearArray;
end;
Doc.ksTrimmCurve(obj,x1,y1,xx,yy,x1,y1,1);
end;
Всё вроде верно делал по вашему примеру.

Гость форума

Цитата: Гость форума от 08.05.09, 10:25:22
Цитата: prog1 от 08.05.09, 10:15:45
Попробуйте вставить этот кусок кода и взгляните как отрабатывает:
procedure pr_InterStep(Obj1,Obj2:Reference);
var DynArray:ksDynamicArray;   
    Point  :ksMathPOintParam;
begin
DynArray:=ksDynamicArray(Kompas.GetDynamicArray(POINT_ARR));  if DynArray=nil then exit;
Point:=ksMathPointParam(Kompas.GetParamStruct(14));
  If Mat.ksIntersectCurvCurv(Obj1,Obj2,DynArray)=1 then begin   
  If DynArray.ksGetArrayCount()=2 then begin // 2 точки пересеч
   DynArray.ksGetArrayItem(0,Point);   Inter1[i-1]:=Point.y;
   DynArray.ksGetArrayItem(1,Point);   Inter1:=Point.y;
   DynArray.ksClearArray; End;End;
-----------------
Удачи!
Получилось так:
procedure cutcut(x1,y1:real;obj,obj1:reference);
var
   tMathPoint : ksMathPointParam;
   DynArray   : ksDynamicArray;
   mat        : ksMathematic2D;
   arr        : reference;
   xx,yy:real;
begin
   tMathPoint := ksMathPointParam( kompas.GetParamStruct(ko_MathPointParam) );
   tMathPoint.Init;
   DynArray:=ksDynamicArray(Kompas.GetDynamicArray(POINT_ARR));
   mat:=ksMathematic2D( Kompas.Document2D );
If mat.ksIntersectCurvCurv(obj,obj1,DynArray)=1 then //!!!Вот тут ошибка : несовместимость типов!!!
begin
 DynArray.ksGetArrayItem(0,tMathPoint);
 yy:=tMathPoint.Y;
 xx:=tMathPoint.X;
 DynArray.ksClearArray;
end;
Doc.ksTrimmCurve(obj,x1,y1,xx,yy,x1,y1,1);
end;
Всё вроде верно делал по вашему примеру.
Получилось! Большое спасибо!!!

prog1

внесите ksTrimmCurve(obj,x1,y1,xx,yy,x1,y1,1) в oператорные скобки begin - end oт If intersect (т.е. обрезать только если есть пересечение)
иначе может быть ерунда: xx,yy - не определены. Или  присваивайте им значение x1,y1.
Удачи!

Гость форума

Спасибо что помогли решить вопрос с "усечением".
у меня появился ещё один вопрос: не могу найти апи-функцию "Удлинить до ближайшего объекта".
Заранее спасибо за ответ.

Гость форума

Цитата: Гость форума от 11.05.09, 01:39:14
Спасибо что помогли решить вопрос с "усечением".
у меня появился ещё один вопрос: не могу найти апи-функцию "Удлинить до ближайшего объекта".
Заранее спасибо за ответ.
И если есть возможность подскажите как заполнить графу "Разраб" и "Пров", остальное в рамке заполнил
и как в рабочей области чертежа написать текст:
1....
2...
3...

Администратор

Тема закрыта. Причина: отправка в тему вопроса, к ней не относящегося.

Для каждого отдельного вопроса надо создавать отдельную тему с информативным заголовком. А не спрашивать о графах основной надписи в теме с названием «ksTrimCurve»