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

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

вычисление координат textbox-а

Ответ
Поиск в этой теме
Непрочитано 16.01.2012, 08:02 #1
вычисление координат textbox-а
mamuk
 
Сургут
Регистрация: 06.05.2010
Сообщений: 248

доброго дня!! у меня появилась немного специфическая задача! Есть такая программа MapInfo мне необходимо передать в нее текст. делаю это через обменный формат mid/mif формирую данные файлы но когда импортирую его в MapInfo тексты сбиваются в "кучу". я подозреваю это из-за вычисления координат textbox-а который записывается в формат mif. вопрос как его правильно вычислить для программы MapInfo.
сам код.
Код:
[Выделить все]
 (defun export_text (/)
  (setq set_text (ssget "_X" (list  (cons 8 "PI_OTDEFAULT" ) (cons 0 "text"))))
  (setq dwg_prefix (getvar "dwgprefix"))
 (setq deskriptor_mif (open (strcat dwg_prefix "РельефТК.MIF") "w"))
  (setq deskriptor_mid (open (strcat dwg_prefix "РельефТК.MID") "w"))
	 (setq Static_data "Version 300
Charset \"WindowsCyrillic\"
Delimiter \",\"
CoordSys Earth Projection 8, 1001, \"m\", 72.05, 0, 1, 3500000, -5811057.6299999999 Bounds (-4749281.53901, -15813195.1278)
(11749281.539, 4191079.86776)
Columns 4
  Код_классификатора Char(10)
  Подпись Char(100)
  Описание Char(254)
  Код_объекта_слоя Char(10)
  Data")
  (write-line Static_data deskriptor_mif)
   (setq a -1)
(repeat (sslength set_text)
		  (setq a (1+ a))
		  (setq name_prim  (ssname set_text a))
		  (setq list_coord_text (append list_coord_text (vl-remove-if-not '(lambda(x)(=(car x) 10))(entget name_prim))))
                  (setq list_text (append list_text (vl-remove-if-not '(lambda(x)(=(car x) 1))(entget name_prim))))
		  )
  (setq b -1)
(repeat (sslength set_text)
	  (setq b (1+ b))
   (setq point (nth b list_coord_text))
  (setq text1 (cdr(nth  b list_text)))
(write-line (strcat "Text" "\n"  "\"" text1 "\""  "\n" (rtos (nth 1 point) 2 2) " "(rtos (nth 2 point) 2 2) " " (rtos (+ 10.0 (nth 1 point)) 2 2) " " (rtos (+ 10.0 (nth 1 point)) 2 2)
                         "\n " "Font (\"Bm431\",0,0,165)") deskriptor_mif);тут вычисляю координаты прямоугольника
  (write-line (strcat "\" \"" "," "\" \"" "," "\" \"" "," "\" \"") deskriptor_mid)
  )
  )
вычисление координат непосредственно самого textbox-а в автокаде и перевод их в координаты чертежа тоже результатов не дал.
Просмотров: 8001
 
Непрочитано 16.01.2012, 10:08
1 | #2
Кулик Алексей aka kpblc
Moderator

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


Я подозреваю, что вопрос не в границах TEXT, а в точке вставки: http://autolisp.ru/2010/04/06/text-and-attrib-entities/
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 16.01.2012, 10:35
#3
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 12,351


Ну и где же в коде функции использование функции textbox? Там просто добавление к координате точки.

Что касается "сбивательства", то это, скорее всего связано с Bounds - ограничивающим прямоугольником таблицы Mapinfo. Если координаты любых объектов выходят за границы Bounds, они будут рисоваться именно "сбившимися" вдоль границ.

Проверяйте системы координат Автокада и Mapinfo, координаты точек и Bounds в полученном MIF.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 16.01.2012, 10:59
#4
mamuk


 
Регистрация: 06.05.2010
Сургут
Сообщений: 248


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Ну и где же в коде функции использование функции textbox? Там просто добавление к координате точки.
извиняюсь не тот файл выложил! там я делал так, получал координаты textbox-а и потом координату верхнего правого угла прибавлял к точке вставке текста.

Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Что касается "сбивательства", то это, скорее всего связано с Bounds - ограничивающим прямоугольником таблицы Mapinfo. Если координаты любых объектов выходят за границы Bounds, они будут рисоваться именно "сбившимися" вдоль границ.

Проверяйте системы координат Автокада и Mapinfo, координаты точек и Bounds в полученном MIF
похоже как не правильная СК, но точки спокойно экспортируются при идентичном Bounds с того же самого файла файла. вот я и стал думать что в вычислениях не-то что то.
а неправильно вычисленная рамка текста может такой же баг выдать?
mamuk вне форума  
 
Непрочитано 16.01.2012, 11:32
1 | #5
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 12,351


Цитата:
похоже как не правильная СК, но точки спокойно экспортируются при идентичном Bounds с того же самого файла файла. вот я и стал думать что в вычислениях не-то что то.
"Мапинфе" наплевать на то, какие значения координат указаны в MIF. Для нее важна строка
CoordSys Earth Projection 8, 1001,...
По этой строке устанавливается система координат и проекция создаваемой таблицы. И считается, что координаты точек даны именно в этой системе и проекции.
8 и 1001 вроде бы говорит о Гаусс-Крюгере какой-то зоны. Это значит, что в начале всех координат точек должен стоять фиктивный номер зоны, Наподобие 11. Вот, например, как описывается CoordSys по моим картам:

Цитата:
CoordSys Earth Projection 8, 1001, "m", 63, 0, 1, 11500000, 0 Bounds (11400000, 5900000) (11950000, 6350000)
Это ГК 11 зоны. Bounds заданы заведомо охватывающие всю территорию. Хорошие "круглые" числа.

Координаты точек имеют значения наподобие

11513005.72 6063796.767
11507208.03 6063351.055
...
11540619.05 6214821.21
11540604.57 6214899.74

Это все не тексты, а точки линий. Но все лежат внутри Bounds. Тексты вообще дурной стиль использовать - надо применять атрибуты (поля таблиц), тогда можно пользоваться "Надписями", которые будут автоматически рисоваться.

Еще надо учитывать единицы измерения в AutoCAD и Mapinfo. Они должны быть одинаковые. А также направления осей - в Mapinfo Х направлена на Север.

Что касается LISP-функции textbox, то надо учитывать, что для правильного вычисления габарита ей надо и параметр высоты текста передавать, наподобие

Код:
[Выделить все]
 (textbox
  (list (cons 1 string) (cons 40 txt_height) (cons 50 0))
)
Иначе размеры будут возвращены по текущему стилю, а не такие, какие вы желаете получить для будущих текстов.
ShaggyDoc вне форума  
 
Непрочитано 16.01.2012, 11:52
1 | #6
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,888
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Подробнее по textbox и его заменители здесь: Автоматический подбор высоты текста
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 17.01.2012, 06:38
#7
mamuk


 
Регистрация: 06.05.2010
Сургут
Сообщений: 248


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Тексты вообще дурной стиль использовать - надо применять атрибуты (поля таблиц), тогда можно пользоваться "Надписями", которые будут автоматически рисоваться.
да я бы рад отказаться, только сами понимаете заказчик хочит так... они целый классификатор сделали да еще программулину для MApinfo в которой УЗ рисуются "АРМ топографа".
спасибо я попробую все это учесть может и получится сделать!
mamuk вне форума  
 
Непрочитано 07.05.2021, 18:00
#8
wepp

Инжиниринг
 
Регистрация: 16.09.2011
Тюмень
Сообщений: 187


Цитата:
Сообщение от mamuk Посмотреть сообщение
спасибо я попробую все это учесть может и получится сделать!
Почти 10 лет прошло, а решаем те же проблемы. Версии кода свежее не появилось? Покопался в вашей выложенной. К точке вставке текста прибавлялось 10, без всяких вычислений, только для верхнего правого угла два раза X записывался. Ещё попытался в шапку сделать запись границ чертежа, через функцию get-view-size от Кулик Алексей aka kpblc. Это не совсем пределы чертежа, конечно, а всего экрана, но хотя бы так. И то, до конца с моими познаниями не вышло (не могу вывести в одну строку со статичным текстом и убрать лишние скобки.

Код:
[Выделить все]
 (defun C:export_text ( / );ИмяФункции(ПараметрыФункции / ЛокальныеПеременныеФункции)
 (setq set_text (ssget "_X" (list  (cons 8 "РельефТК" ) (cons 0 "text"))))
 (setq dwg_prefix (getvar "dwgprefix"))
 (setq deskriptor_mif (open (strcat dwg_prefix "РельефТК.MIF") "w"))
 (setq deskriptor_mid (open (strcat dwg_prefix "РельефТК.MID") "w"))
     (setq Static_data1 "Version 300
Charset \"Neutral\"
Delimiter \",\""
     Static_data2 (strcat "CoordSys NonEarth Units \"m\" Bounds ");здесь нужно получить область чертежа вместо статичного набора координат
     Static_data3 "
	   Columns 2
  Код_классификатора Char(10)
  Подпись Char(100)
Data")
  (write-line Static_data1 deskriptor_mif)
  (write-line Static_data2 deskriptor_mif)
  (princ (get-view-size) deskriptor_mif)
  (write-line Static_data3 deskriptor_mif)
   (setq a -1)
(repeat (sslength set_text)
          (setq a (1+ a))
          (setq name_prim  (ssname set_text a))
          (setq list_coord_text (append list_coord_text (vl-remove-if-not '(lambda(x)(=(car x) 10))(entget name_prim))))
                  (setq list_text (append list_text (vl-remove-if-not '(lambda(x)(=(car x) 1))(entget name_prim))))
         )
  (setq b -1)
(repeat (sslength set_text)
      (setq b (1+ b))
   (setq point (nth b list_coord_text))
  (setq text1 (cdr(nth  b list_text)))
(write-line (strcat "Text" "\n"  "\"" text1 "\""  "\n" (rtos (nth 1 point) 2 2) " "(rtos (nth 2 point) 2 2) " " (rtos (+ 10.0 (nth 1 point)) 2 2) " " (rtos (+ 10.0 (nth 2 point)) 2 2)
                         "\n " "Font (\"Bm431\",0,0,165)") deskriptor_mif);тут вычисляю координаты прямоугольника (это от старого автора, я поправил последнюю координату X на Y)
  (write-line (strcat "\" \"" "," "\" \"" "," "\" \"" "," "\" \"") deskriptor_mid)
  )
  )

;функция для получения координат экрана
(defun get-view-size (/ viewctr width height)
  (setq viewctr (getvar "viewctr")
        height  (getvar "viewsize")
        width   (* height (apply (function /) (getvar "screensize")))
  ) ;_ end of setq

  (list (list (rtos (- (car viewctr) (* 0.5 width)) 2 2) "," (rtos (- (cadr viewctr) (* 0.5 height)) 2 2))
        (list (rtos (+ (car viewctr) (* 0.5 width)) 2 2) "," (rtos (+ (cadr viewctr) (* 0.5 height)) 2 2))
  ) ;_ end of list

  
) ;_ end of defun

;закрыть файлы
(close deskriptor_mif)
(close deskriptor_mid)
Следующим этапом хочу поразбираться с textbox, если всё-таки не получится выводить текст хотя бы примерно подходящего размера (я так понимаю, для данного кода будут сложности, когда текст будет с поворотом.
Ну и потом прицепить к этому году классификатор XML, чтобы настройки слоя (и имени файла) цвета и шрифта, которые сейчас статичны, подхватывались оттуда. У нас процедура настроена таким образом, что уже в самом Автокаде мы раскладываем объекты по слоям с именами будущих таблиц Mapinfo. И коды у объектов есть (т.е. .mid файл тоже не пустой будет).

Последний раз редактировалось wepp, 11.05.2021 в 13:05.
wepp вне форума  
 
Непрочитано 07.05.2021, 20:07
1 | #9
Кулик Алексей aka kpblc
Moderator

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


wepp, лишние звездочки из кода убери.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.05.2021, 13:06
#10
wepp

Инжиниринг
 
Регистрация: 16.09.2011
Тюмень
Сообщений: 187


Кулик Алексей aka kpblc, спасибо, убрал. Почему-то только после публикации проявились. Код скопировал из Visual LISP в Notepad++, а потом сюда. Напрямую - кодировка слетала.
wepp вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > вычисление координат textbox-а

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
GetBoundingBox и textbox некорректно обрабатывают многострочные атрибуты Ax3 Программирование 6 08.10.2010 15:12
2 системы координат в одном файле SStas AutoCAD 8 20.06.2007 10:22
Помощь по Лире Серега М Лира / Лира-САПР 52 28.05.2007 02:47
управление системой координат Автокад из Делфей Владимир В Программирование 12 27.04.2005 09:54