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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как получить точное значение InsertionPoint мультитекста с помощью Lisp?

Как получить точное значение InsertionPoint мультитекста с помощью Lisp?

Ответ
Поиск в этой теме
Непрочитано 14.02.2016, 20:17 #1
Как получить точное значение InsertionPoint мультитекста с помощью Lisp?
burrino
 
Регистрация: 28.06.2008
Сообщений: 16

Применяю функцию vla-get-InsertionPoint для получения точки вставки мультитекста. Получаю трехмерные координаты: вещественные числа, один знак после запятой, который всегда 0. Т.е. это не фактическая точка вставки текста, а округленные до целого значение координаты в виде вещественных чисел. Длячего это нужно: Точка вставки мультитекста совпадает в плановом положении с примитивом точка и мне требуется программно выбрать все точки, по определенному содержанию мультитекста. Мультитекст с определенным содержанием я выбираю, получаю по свойствам vla-объекта точку вставки ... но точка вставки округленная и, поэтому примитивы-точки я выбрать не могу.
Подскажите, пожалуйста, в чем причина получения округленного значения точки вставки и как можно решить эту проблему?
Просмотров: 2622
 
Непрочитано 14.02.2016, 20:40
1 | #2
Кулик Алексей aka kpblc
Moderator

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


Не путай точное значение и отображаемое значение. Поменяй, например, luprec, или используй функцию rtos с максимальной точностью - посмотришь на результаты.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 14.02.2016, 21:05
#3
burrino


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


Спасибо

----- добавлено через ~15 мин. -----
Но, все равно осталась небольшая неясность . Применил rtos с округлением до 4 знаков. Все четко: появилось строковое значение с четырьмя знаками после запятой. Так, как мне нужно в итоге получить вещественное число, а не строку, то я следом применяю функцию atof... и эта функция снова делает округленное вещественное число с одним нулем после запятой, т.е. округленное до целого вещественное число. Проверяю переменную lucrec, ее значение 4. Какая еще переменная влияет на перевод строкового представления числа в вещественное?
Пример: (atof (rtos (vlax-safearray-get-element (vlax-variant-value (vla-get-InsertionPoint x)) 1) 2 4))
burrino вне форума  
 
Непрочитано 14.02.2016, 21:21
#4
Кулик Алексей aka kpblc
Moderator

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


Еще раз: отображается 10.5, а по факту там 10.456989899965656. В памяти хранится именно второе значение, используется именно второе значение.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 14.02.2016, 21:28
#5
burrino


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


Да, но я из этих значений, которые отображаются округленными, формирую лист, а затем вставляю в функцию SelectAtPoint в качестве аргумента - точки, в соответствии с которой я выбираю примитивы-точки с такими координатами. И эта функция точки не находит. А если я вместо округленных значений вставляю в качестве аргумента точные координаты, то точки находятся.
burrino вне форума  
 
Непрочитано 14.02.2016, 21:44
#6
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от burrino Посмотреть сообщение
формирую лист
А каким боком тут Layout? И SelectAtPoint, насколько я помню, требует наличия выбираемой точки на видимой области экрана.
P.S. Вообще говоря, я не очень понимаю сути проблемы: выбраны точки, выбраны MText, получены указатели на все объекты. Дальше можно вообще без интерактивности обойтись.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 14.02.2016, 21:58
#7
burrino


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


Layout здесь ни при чем. Я в сообщении пишу: "формирую лист", имея ввиду список (List) точек. Суть проблемы в следующем: имеется множество точек - примитивов AutoCAD и каждой точке соответствует мультитекст, точка вставки которого, совпадает с точкой-примитивом. Текст вставлялся программно, и за точку вставки и были приняты координаты точки-примитива. Мультитекст содержит информацию о точке: порядковый номер, высоту и код. Например группа точек содержит код "(pv)" Нужно выбрать все точки, подписи к которым в своем содержании содержат "(pv)". Я выбираю текст который удовлетворяет таким условиям, считываю с каждого примитива текста его точку вставки и формирую из этих точек список, элементы которого, затем служат поочередно аргументами функции SelectAtPoint. И таким образом я выберу все точки к которым относится мультитекст, содержащий символы "(pv)".
burrino вне форума  
 
Непрочитано 14.02.2016, 22:36
#8
Кулик Алексей aka kpblc
Moderator

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


Без проверки:
Код:
[Выделить все]
 (defun test (/ fun_conv-selset ss_pt ss_mtext)
  (defun fun_conv-selset (selset / tab item)
    (repeat (setq tab  nil
                  item (sslength selset)
                  ) ;_ end setq
      (setq tab (cons (ssname selset (setq item (1- item))) tab))
      ) ;_ end of repeat
    ) ;_ end of defun
  (if (and (setq
             ss_pt (mapcar (function
                             (lambda (x) (cons x (vlax-safearray->list (vlax-variant-value (vla-get-insertionpoint x)))))
                             ) ;_ end of function
                           (fun_conv-selset (ssget "_X" '((0 . "POINT") (67 . 0))))
                           ) ;_ end of mapcar
             ) ;_ end of setq
           (setq ss_mtext (ssget "_X" '((0 . "MTEXT") (67 . 0))))
           (setq ss_mtext
                  (mapcar (function
                            (lambda (x) (cons x (vlax-safearray->list (vlax-variant-value (vla-get-insertionpoint x)))))
                            ) ;_ end of function
                          (vl-remove-if-not
                            (function (lambda (x) (wcmatch (strcase (vla-get-textstring x)) "*(PV)*")))
                            (mapcar (function vlax-ename->vla-object) (fun_conv-selset ss_mtext))
                            ) ;_ end of vl-remove-if-not
                          ) ;_ end of mapcar
                 ) ;_ end of setq
           ) ;_ end of and
    (mapcar (function car)
            (vl-remove-if-not (function (lambda (x) (member (cdr x) (mapcar (function cdr) ss_mtext)))) ss_pt)
            ) ;_ end of mapcar
    ) ;_ end of if
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 16.02.2016, 20:50
#9
burrino


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


Большое спасибо!
Все работает (только добавил в 11 строчке перед x: (vla-get-Coordinates (vlax-ename->vla-object ...)
burrino вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как получить точное значение InsertionPoint мультитекста с помощью Lisp?

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Создание поля (field), ссылающегося на текстовое значение ячейки таблицы. skkkk Готовые программы 141 24.11.2023 15:49
Разработка ПОС, искусство проектирования Tyhig Технология и организация строительства 117 25.11.2021 17:38
Какой язык перспективен для инженера-конструктора с условием The_Mercy_Seat Программирование 705 17.03.2021 14:19
Проблемы с расчетом Ж/Б каркаса в ANSYS derik ANSYS 457 04.07.2017 16:16
Lisp/ActiveX. Как получить значение элемента безопасного массива? Kirill_Ja LISP 1 15.08.2013 12:28