Реклама i
Стань нашим партнером - зарабатывай с нами!
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Получение текстовой строки чертежа AutoCad по конкретным координатам

Получение текстовой строки чертежа AutoCad по конкретным координатам

Ответ
Поиск в этой теме
Непрочитано 17.01.2012, 23:13 #1
Получение текстовой строки чертежа AutoCad по конкретным координатам
serega82
 
Регистрация: 17.01.2012
Сообщений: 8

Добрый день!

Есть программа, которая оставляет текст на чертеже AutoCad по конкретным координатам:
Код:
[Выделить все]
  p:=VarArrayCreate([0, 2],varDouble);
  p[0]:=100;  //x
  p[1]:=100;   //y
  AcadText:=Autocad.ActiveDocument.ModelSpace.AddText('Текст', p, 5);
Каким образом при следующем запуске программы можно прочитать текст, координаты которого известны? Вопрос из-за того, что текст каждый раз разный либо вовсе отсутствует, координаты постоянны. В интернете ничего похожего не нашел.

Последний раз редактировалось Кулик Алексей aka kpblc, 17.01.2012 в 23:23.
Просмотров: 5501
 
Непрочитано 17.01.2012, 23:23
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,844


Гарантированно работающий вариант - пройтись по всем примитивам ModelSpace и отфильтровать тексты с нужными координатами.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 18.01.2012, 09:11
#3
serega82


 
Регистрация: 17.01.2012
Сообщений: 8


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Гарантированно работающий вариант - пройтись по всем примитивам ModelSpace и отфильтровать тексты с нужными координатами.
все мои познания работы с AutoCad через delphi заключаются в вычерчивании различных фигур, добавлении текста, изменение цветов, штриховка. Не могли бы вы привести пример Вашего метода или скинуть ссылку, где это можно почитать. Спасибо.
serega82 вне форума  
 
Непрочитано 18.01.2012, 10:32
#4
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


берете ActiveDocument.ModelSpace (то куда вы через delphi добавляете примитивы) просмативаете все item'ы и у тех из них которые text, mtext проверяете координаты.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 18.01.2012, 10:41
#5
serega82


 
Регистрация: 17.01.2012
Сообщений: 8


Цитата:
Сообщение от Дима_ Посмотреть сообщение
берете ActiveDocument.ModelSpace (то куда вы через delphi добавляете примитивы) просмативаете все item'ы и у тех из них которые text, mtext проверяете координаты.
Не могли бы вы привести простенький пример, для меня пока это к сожалению дремучий лес.
serega82 вне форума  
 
Непрочитано 18.01.2012, 10:58
#6
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Я дельфи не знал и забыл, могу чиркануть на лиспе, либо f# но боюсь для Вас это будет еще более дремучий лес.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 18.01.2012, 11:22
#7
serega82


 
Регистрация: 17.01.2012
Сообщений: 8


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Я дельфи не знал и забыл, могу чиркануть на лиспе, либо f# но боюсь для Вас это будет еще более дремучий лес.
чирканите пожалуйста на лиспе, думаю смогу перевести на дельфи. команды то одинаковы
serega82 вне форума  
 
Непрочитано 18.01.2012, 12:46
#8
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Ну если совсем на лиспе то все это "чирикаеться" в одну строчку (реально в одну) - т.к. там есть готовые функции выборки, но толку от нее Вам никакого, т.к. Вы из дельфи можете использовать ТОЛЬКО объектную модель (ну из дельфи. Net еще и соответствующие API - но это, как я понимаю не "наш" случай). Вот попытался "максимально просто" изложить аналогичную фильтрацию на лиспе (единственно что Вам потрбуеться реализовать самостоятельно это аналог функции distance - (строка 16 - получение расстояния между двумя координатами точек)):
Код:
[Выделить все]
 (vl-load-com)
(defun item-list(obj) ;преобразование коллекции в список
  ((lambda (frec count) (frec 0));объявлем временную рекурсивную функцию и берем количество эл-тов коллекции
   (lambda (x) ;сама временная функция (аргумент номер в коллекции)
     (if (/= x count);если номер не равен количеству эл-тов
         (cons (vla-item obj x) (frec (1+ x)))));добавляем элемент х перед самовызовом функции от x+1
   (vla-get-count obj))); количество элементов (см. строку 3)

(defun search-text(pt len);ищем текстовые примитивы на расстояние не более чем len от точки pt
  (vl-remove-if-not ;отфильтровать все не соответствующие условиям
   '(lambda (obj) ; функция проверки условия от примитива
      (and ((lambda (name); объявляем имя класса
              (or (= name "AcDbText")
                  (= name "AcDbMText"))) ; имя класса соответствует тексту, либо Мтексту 
            (vla-get-objectname obj)); получаем имя класса
           (<= (distance (vlax-safearray->list
                          (vlax-variant-value
                           (vla-get-insertionpoint obj)))
                         pt)
               len))) ; и (к соответствию классов) чтоб не дальше расстояния len от точки pt 
   (item-list (vla-get-modelspace(vla-get-activedocument(vlax-get-acad-object)))))) ; фильруемый список всех вхождений modelspace
пример запуска - (search-text '(0 0 0) 10) - найти все тексты удаленные не более чем на 10 ед. рисунка от точки (0 0 0).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 18.01.2012, 13:00
#9
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


object.SelectAtPoint(Point, [FilterType], [FilterData]) ?
gomer вне форума  
 
Автор темы   Непрочитано 18.01.2012, 13:20
#10
serega82


 
Регистрация: 17.01.2012
Сообщений: 8


Дима_ спасибо! код это очень не просто перевести на дельфи.


Цитата:
Сообщение от gomer Посмотреть сообщение
object.SelectAtPoint(Point, [FilterType], [FilterData]) ?
спасибо! объект я получу, полагаю в моем случае код будет выглядить так:
Var_OleVarian.SelectAtPoint(P));
но как из переменной Var_OleVarian прочитать текст, если он есть там? Или в случае нахождения в этой переменной только текста, то переменная и будет этим текстом?
serega82 вне форума  
 
Непрочитано 18.01.2012, 13:42
#11
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


То gomer через SelectAtPoint с учетом точек по моему будут выбранны только видимые в текущем масштабе. Ну и потом все равно из набора "вытягивать" (я не знаю есть-ли в дельфи автоматические преобразования "слаботипизированных" коллекций).
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 18.01.2012 в 13:48.
Дима_ вне форума  
 
Непрочитано 18.01.2012, 14:11
#12
trir


 
Регистрация: 18.12.2010
Сообщений: 5,057


Код:
[Выделить все]
Sub Example_SelectAtPoint()
    ' This example adds objects to a selection set by identifying a point.
    ' At first all objects at the point are added to the selection set. Then
    ' only circle objects at the point are added to the selection set.
    
    ' Create the selection set
    Dim ssetObj As AcadSelectionSet
    Set ssetObj = ThisDrawing.SelectionSets.Add("TEST_SSET1")
   
    ' Add to the selection set all the objects that lie at point(6.8,9.4,0) 
    Dim point(0 To 2) As Double
    point(0) = 6.8: point(1) = 9.4: point(2) = 0
    ssetObj.SelectAtPoint point
    
    ' Add to the selection set all the Circles that lie at point (6.8,9.4,0) 
    Dim gpCode(0) As Integer
    Dim dataValue(0) As Variant
    gpCode(0) = 0
    dataValue(0) = "Circle"
    
    Dim groupCode As Variant, dataCode As Variant
    groupCode = gpCode
    dataCode = dataValue
    
    ssetObj.SelectAtPoint point, groupCode, dataCode
    
End Sub
Изучай VBA и справку для разработчиков

gpCode(0) = 0
dataValue(0) = "Text"
trir вне форума  
 
Автор темы   Непрочитано 18.01.2012, 14:25
#13
serega82


 
Регистрация: 17.01.2012
Сообщений: 8


to trir Спасибо!
serega82 вне форума  
 
Непрочитано 18.01.2012, 15:36
#14
Rembo_4


 
Регистрация: 18.01.2012
Сообщений: 5


При выборе SelectAtPoint надо указывать точки вставки текста или любую точку в приделах текста?
Rembo_4 вне форума  
 
Непрочитано 18.01.2012, 16:09
#15
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


там вариантов чего надо (и соответственно чего получим) вагон и маленькая тележка - см. help по лисп функции ssget
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 19.01.2012, 00:03
#16
serega82


 
Регистрация: 17.01.2012
Сообщений: 8


Разобрался, выкладываю мож кому то пригодится на дельфи:

Код:
[Выделить все]
   p:=VarArrayCreate([0, 2],varDouble);
 //координаты точки, которая попадает на текст
   p[0]:=10;  //x
   p[1]:=20;   //y
  try
    SelSet:= Autocad.ActiveDocument.SelectionSets.Add('TextFromPoint');  //SelSet : OleVarian
  except
    SelSet:= Autocad.ActiveDocument.SelectionSets.Item('TextFromPoint');
    SelSet.Delete;
    SelSet:= Autocad.ActiveDocument.SelectionSets.Add('TextFromPoint');
  end;
  SelSet.SelectAtPoint(p);
  try
    st:=SelSet.Item(0).TextString;
  except
    st:='';
  end;
  if (st<>'') then 
  begin
    showmessage('текст найден '+st);
    Autocad:=unassigned;
    Autocad:=0;
    exit;
  end;

Последний раз редактировалось Кулик Алексей aka kpblc, 19.01.2012 в 10:26.
serega82 вне форума  
 
Непрочитано 19.01.2012, 10:26
#17
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,844


serega82, почувствуй разницу между тэгами quote (цитата) и code (код).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.01.2012, 12:17
#18
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,407
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от serega82 Посмотреть сообщение
Разобрался
Это иллюзия. Иллюзия, что этот код будет стабильно работать. Тебе уже писали, что метод SelectAtPoint работает только тогда, когда точка видна на экране. И это не единственное ограничение.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 19.01.2012, 14:30
#19
serega82


 
Регистрация: 17.01.2012
Сообщений: 8


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Это иллюзия. Иллюзия, что этот код будет стабильно работать. Тебе уже писали, что метод SelectAtPoint работает только тогда, когда точка видна на экране. И это не единственное ограничение.
не спорю, этот код был собран из кусков из интернета. я не программист, и все что описывается на многих форумах для меня по большому счету не понятно. по этой причине я подгонял этот код под результат, тупо меняя типы переменных, переставляю все местами по 10 раз. в течении вечера добился работоспособности, хоть и не универсальной, не оптимальной, но в моем случае рабочий. К сожалению код на дельфи я не нашел, а подсказки и советы были на языке программистов, для меня не особо понятном :-)
serega82 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Получение текстовой строки чертежа AutoCad по конкретным координатам

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вылетает AutoCAD при открытии чертежа aydarka AutoCAD 20 16.05.2023 21:23
1. AutoCAD Кулик Алексей aka kpblc FAQ: Часто задаваемые вопросы 25 27.09.2016 13:29
запуск программы из AutoCADа kminas Программирование 19 15.06.2012 13:42
Не работает Copy/Paste с конкретным файлом чертежа и Wblock Nai AutoCAD 7 17.05.2012 12:55
Вставка AutoCAD чертежа в Word Youdgin AutoCAD 36 02.09.2011 17:14