Создание контура по штриховке

Автор Sprinter500, 12.02.15, 17:59:33

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

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

Sprinter500

Нет. Просто непонятно как использовать ksCalcInertiaProperties. Хотя ладно - самое главное, что код получения границ заработал - а площадь можно и вручную по границе узнать.

12.03.15, 22:22:33 #41 Последнее редактирование: 13.03.15, 01:21:51 от Sabahs
Можно вручную, я так делаю.
var
Properties:ksInertiaParam;
Grupp:Reference;
iMath:ksMathematic2D;
...
iMath.ksCalcInertiaProperties(Grupp,Properties,ST_MIX_MM);
+ Благодарностей: 1

Sprinter500

Sabahs, а почему первый вариант кода (тот где для всех штриховок) работает и в случае если штриховка одна, а второй, который для выделенных пришлось корректировать - вводить допю условие для VT_DISPATCH.?

Потому, что в первом случае возвращается указатель на массив, а во втором на объект, т.к. он один.

Sprinter500

Копнем глубже - почему в первом случае -указатель на массив из 1 объекта, а во втором - сразу на объект? То есть почему реализованы механизмы по разному?

Вы видео из отладчика запишите, чтобы можно было в этом убедится.

Sprinter500

Уважаемый Sabahs, можете еще заглянуть на эти 2 темы ?:

http://forum.ascon.ru/index.php/topic,27607.msg206907.html#msg206907

http://forum.ascon.ru/index.php/topic,27322.msg203795.html#msg203795

Очень хочется узнать мнение профессионала.

Каков в этом смысл?
Прикрепите код, я же здесь не один - Вам помогут.

Sprinter500

А такое ощущение что только один спец.

1. По первой ссылке смысле нет в коде -  просто нужно понять какие изменения в API произошли по сравнению с V13, которые мешают работать коду в 3D. Или может быть это вообще не решаемая проблема - раз в АСКОНе прекратили поддержку VB6 и перешли на VB.NET.
2. Тут и кода нет. Я на нулевой отметке. Тема о копировании видов целиком из одного документа в другой.


Sprinter500

Что то у меня на строчке:

iMath.ksCalcInertiaProperties(Grupp,Properties,ST_MIX_MM);

программа вылетает.

Весь код показывайте, который участвует в этой строке.

Sprinter500

procedure BackToContur();//Получение контура из штриховки или заливки
var
  drawCont      : IDrawingContainer;
  arr           : OleVariant;
  pObj          : IDispatch;
  arrCount, j,
  objType       : integer;
  pDrawObj      : IDrawingObject;
  objRef        : reference;

  Properties    : ksInertiaParam;
  iMath         : ksMathematic2D;
begin
  pKompasDocument2D1 :=  pKompasDocument2D as iKompasDocument2D1;
  pSelectionManager := pKompasDocument2D1.SelectionManager;
   drawCont := GetDrawingContainer;// Получить контейнер графических объектов
   if ( drawCont <> nil ) then
   begin
    arr := pSelectionManager.SelectedObjects; //Получить массив выделенных объектов
    // Если массив есть и он не пуст
      if ( VarType(arr) = (VT_ARRAY Or VT_DISPATCH) ) then arrCount := ( VarArrayHighBound( arr,  1 ) + 1 ) else
    if (VarType(arr) = VT_DISPATCH) then arrCount := 1;
      for j := 0 to arrCount - 1  do
      begin
        if (VarType(arr) = VT_DISPATCH) then pObj := IDispatch(arr)
        else  pObj := arr[j]; // Получить элемент из массива
        if ( pObj <> nil ) then
        begin
          pDrawObj := pObj As IDrawingObject; // Получить интерфейс графического объекта
          if ( pDrawObj <> nil ) then
          begin
            objType := pDrawObj.DrawingObjectType; // Получить тип объекта
            if (objType=ksDrHatch) or (objType=ksDrColorFill) then
            begin
              objRef := pDrawObj.Reference; // Получить референс объекта
              iMath.ksCalcInertiaProperties(objRef,Properties,ST_MIX_MM);
              Document2D.ksStoreTmpGroup(Document2D.ksDuplicateBoundaries(objRef));
              //Dout:=Dout+Properties.F;
            end;
          end;
        end;
      end;
    end;
end;

А, что Вы хотите?
iMath=nil
Properties=nil

+ Благодарностей: 1

Sprinter500

Что надо сделать с ними чтобы не nil было ?

Учится, или Вы считаете, что я должен Вам тут прописные истины рассказывать.
iMath:=ksMathematic2D(Kompas.GetMathematic2D);
Properties:=ksInertiaParam(Kompas.GetParamStruct(ko_InertiaParam));
PS. Откройте любой пример в SDK.
+ Благодарностей: 1

Sprinter500

Спасибо. Был бы толковый учебник, наподобие Норсеева (но там азы API5 и не слова про API7). но таких нет. А методом тыка, вооружившись лишь примерами, охватывающими далеко не все и справочником, охватывающим все, но без примеров и пояснения, далеко не уедешь. Я по образованию далеко не программист, это просто хобби, так что уж извиняйте.


Sprinter500

Это я к слову. Не мешало бы иметь учебник по API7 для других ситуаций.

Sprinter500

Теперь не вылетает, но площадь почему то нулю равняется. И выдает: "Объект должен быть геометрическим".


objRef1:=Document2D.ksDuplicateBoundaries(objRef);
iMath.ksCalcInertiaProperties(objRef1,Properties,ST_MIX_MM);
+ Благодарностей: 1