Delphi и чертеж компаса

Автор wapdimon72ru, 26.11.25, 07:23:01

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

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

wapdimon72ru

Добрый день.

Как считать текст с линии-выноски?, на скрине это цифры 32, 33, 34

Скрин
https://disk.yandex.ru/i/wililKrZISx3Dg

В своем приложении на делфи добавил panel и на нее вывожу чертеж 2D компаса с помощью компонента TKGAX

kompasAX:= TKGAX.Create(nil);
kompasAX.Parent:= PanelKompas;
kompasAX.Align:= alClient;
kompasAX.AddDocument('C:\Users\zh\Desktop\Weldings_7517.cdw');
 
Kompas:=kompasAX.GetKompasObject;
 
где kompasAX: TKGAX; и Kompas:KompasObject;

все выводится хорошо, далее пытаюсь считать данные с линий-выносок

doc:=ksDocument2D( Kompas.ActiveDocument2D );
 
  iter:=ksIterator(Kompas.GetIterator);
 
  //POSLEADER_OBJ 21 - все, SELECT_GROUP_OBJ 127 - выделенные
  //Привязали итератор к выделенным объектам на чертеже
  if (iter.ksCreateIterator(SELECT_GROUP_OBJ,0)=false) then
  begin
    exit;
  end;
 
  //Первый выделенный элемент
  ref:=iter.ksMoveIterator('F');
 
  //Если объект найден у документа
  if doc.ksExistObj(ref)=1 then
  begin
 
    repeat
      //Подсветить элемент на чертеже 1 да 0 нет не работает только
      //i:=doc.ksLightObj(ref, 1);
 
      //Тип выделенного элемента на чертеже
      objType:= doc.ksGetObjParam(ref, nil, 0);
 
      //POSLEADER_OBJ 21 - линия выноски для обозначения позиции
      if(objType=21)then
      begin
 
        param := ksPosLeaderParam(Kompas.GetParamStruct(ko_PosLeaderParam));
        doc.ksGetObjParam(ref, param, ALLPARAM); //берём ссылку на все параметры объекта
        arr := ksDynamicArray(param.GetpTextline);
        //i:=arr.ksGetArrayCount;
 
        kStr:=ksChar255(kompas.GetParamStruct(ko_Char255));
 
        for i :=  0 to arr.ksGetArrayCount - 1 do begin
           arr.ksGetArrayItem(i,kStr);
           str:=kStr.str;
        end;
 
 
      end;
 
      ref:=iter.ksMoveIterator('N');
    until ref=0;
 
    iter.ksDeleteIterator;
    doc.ksRebuildDocument;
  end;
 
 
где doc:ksDocument2D; iter:ksIterator; i,ref, objType:integer; kStr :ksChar255; param   : ksPosLeaderParam; arr:ksDynamicArray;


Но текста в строке str нету.

С помощью вот этой штуки

i:=doc.ksLightObj(ref, 1);

я подсвечиваю объект на чертеже, то есть объект то получается я вижу верно, но вот считать текст не могу.

Примеры на асконе пересмотрел, ничего подходящего не нашел.

Может кто подсказать как все таки текст с линии выноски считать?

Kolos

Можете архив проекта к сообщению прикрепить?

wapdimon72ru

Была случайно закомментирована для 100500го эксперимента, но сути не меняет, расскоментировал, данные не считываются.

Проект

https://disk.yandex.ru/d/_vlY6DFXMkF4zg

Если что в WeldingsU.pas в procedure TWeldingsF.sbOpenPlanCDWClick(Sender: TObject); открытие чертежа, а в procedure TWeldingsF.sbTestClick(Sender: TObject); попытка считать параметры с линии выноски

Сам файл чертежа, на котором провожу эксперименты https://disk.yandex.ru/d/nSLha4v-F9WWAw






Kolos

К сообщению прикрепите.

wapdimon72ru

В упор не вижу кнопку как прикрепить, не могу на панели найти нужную кнопку, а так прикрепил бы без проблем.

wapdimon72ru

#5

Вроде получилось прикрепить.

Kolos

#6
Цитата: wapdimon72ru от 26.11.25, 07:55:57В упор не вижу кнопку как прикрепить, не могу на панели найти нужную кнопку, а так прикрепил бы без проблем.
Не на я-диск, а сюда архив, желательно zip или 7-z.
Вот эта большая красная кнопка.

изображение_2025-11-26_071421227.png

Позиции вытягиваются правда делал на API7.

изображение_2025-11-26_074723008.png

Вам нужно ещё получить ksTextItemParam - интерфейс динамического массива компонент строки текста.

wapdimon72ru

#7
Вот прикрепил

wapdimon72ru

Вот сейчас правильно прикрепил, прошлый раз ка кто криво получилось

Kolos

Посмотрите пример Step2a.

изображение_2025-11-26_075945982.png

wapdimon72ru

Я его пробовал получать уже, там вообще никаких данных не возвращает

textItem : ksTextItemParam;
arr : ksDynamicArray;

textItem := ksTextItemParam( kompas.GetParamStruct(ko_TextItemParam) );

arr := ksDynamicArray( textLine.GetTextItemArr );
i:=arr.ksGetArrayCount;
for i := 0 to arr.ksGetArrayCount - 1 do
begin
  arr.ksGetArrayItem(i,kStr);
  str:=kStr.str;
end;

Дак вот i:=arr.ksGetArrayCount; всегда i = 0

Kolos

Для начала нужно сделать так, чтобы итератор начал работать.

изображение_2025-11-26_083426175.png

wapdimon72ru

Спасибо, так тоже уже делал, сначала бегал по всем линиям выноски, потом только по выделенным

//POSLEADER_OBJ 21 - все, SELECT_GROUP_OBJ 127 - выделенные

То есть итератор работает, ссылки то на объекте заполнены.

Я попробовал из Step2a. добавить всего 2 сточки pLine, p1: reference; и pLine := CreateArray(TEXT_LINE_ARR, nil);. После этого исходник не стартует вообще, то есть ошибок нет, но и экзешкник из делфи не открывает, убираю pLine := CreateArray(TEXT_LINE_ARR, nil); все опять стартует.

Проблема в том что

        textLine := ksTextLineParam( kompas.GetParamStruct( ko_TextLineParam) );
        textItem := ksTextItemParam( kompas.GetParamStruct(ko_TextItemParam) );

они всегда возварщают 0 параметров

      arr := ksDynamicArray( textLine.GetTextItemArr );
      i:=arr.ksGetArrayCount;

Почему так не понимаю.

Kolos

Как-то криво API5 работает на TKGAX, тут лучше на API7 перейти, да и проще будет пробежаться.
С выделенной группой SELECT_GROUP_OBJ, вообще не хочет работать.

wapdimon72ru

Без проблем, могу с API7 попробовать, я на ней тоже не смог получить данные, то есть их там нет, как то не для людей сделано все.


У вас случайно нет простого примера, вот на чертеже чисто одна линия выноски и вот текст с нее, то есть чтобы реально с выноски текст был и считать в строку?

lavgirb

Для номеров позиций. Участок своего кода. Не полный. API7

Dim oPasiLeader   As KompasAPI7.IPositionLeader
Dim oText         As KompasAPI7.Text
vDrawObjs = ArrayObjects(oDrawCont.Objects(ksDrPosLeader))
If Not IsEmpty(vDrawObjs) Then
   For Each vDrawObj In vDrawObjs
      Set oPosiLeader = vDrawObj
      With oPosiLeader
         Set oText = .Positions
         sText = ValueFromText(oText)
         Set oText = .UnderPositionText
         sText = sText + S1 + ValueFromText(oText)
      End With
   Next
End If

wapdimon72ru

Цитата: lavgirb от 26.11.25, 10:05:08Для номеров позиций. Участок своего кода. Не полный. API7

Dim oPasiLeader   As KompasAPI7.IPositionLeader
Dim oText         As KompasAPI7.Text
vDrawObjs = ArrayObjects(oDrawCont.Objects(ksDrPosLeader))
If Not IsEmpty(vDrawObjs) Then
   For Each vDrawObj In vDrawObjs
      Set oPosiLeader = vDrawObj
      With oPosiLeader
         Set oText = .Positions
         sText = ValueFromText(oText)
         Set oText = .UnderPositionText
         sText = sText + S1 + ValueFromText(oText)
      End With
   Next
End If


Спасибо, а что у вас такое vDrawObjs  и oDrawCont ? то есть не виден тип а как заполнены эти объекты

lavgirb

Цитата: wapdimon72ru от 26.11.25, 10:08:02Спасибо, а что у вас такое vDrawObjs  и oDrawCont ? то есть не виден тип а как заполнены эти объекты

Так понятно?
Вид сами укажете.

Dim vDrawObjs    As Variant
Dim oDrawCont    As KompasAPI7.IDrawingContainer
Dim oView        As KompasAPI7.View

Set oDrawCont = oView

ArrayObjects - функция всегда возвращающая массив объектов
ValueFromText - Функция возвращает текст из переменной oText.

Kolos

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

wapdimon72ru

#19
Цитата: Kolos от 26.11.25, 10:57:27Сделал через API7.

Project2.zip

изображение_2025-11-26_095603832.png
изображение_2025-11-26_100521572.png

Спасибо за хороший ответ. Работает.