Скидки на VetCAD++
dwg.ru forum rss xml
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму |

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

Lisp. Присвоение блоку атрибута и Z из текста.

Версия для печати
 
Ответ
Опции темы Поиск в этой теме
Непрочитано 16.08.2010, 11:03 #1
Lisp. Присвоение блоку атрибута и Z из текста.
Ancient John
 
Регистрация: 16.08.2010
Сообщений: 5

Ancient John вне форума Вставить имя

Вообщем, не линчуйте, если тема уже проскакивала - поиск не дал нормальных результатов. Опишу проблему.
1. Нашел программу ZTXT, которая берет отметку Z для точки из близлежащего текста. Переделал её так, чтобы в главой роли был блок, а не текст ("переделал" громко сказано, но все же). Но не могу сделать "контролирующий" элемент в ней. А именно: менять цвет блока отличные от существующего и заполнять его атрибут на тоже значение Z.
Код:
[Выделить все]
(defun C:Ztxt ( / objSet Point ptLst tmp1 tmp2 pat txtZList dst *error*)
(vl-load-com)
(defun *error*(msg)(princ msg)
(vla-EndUndoMark (vla-get-activedocument (vlax-get-acad-object)))(princ))
(vla-StartUndoMark (vla-get-activedocument (vlax-get-acad-object)))
(if (and
      (setq objSet(ssget "_:L" '((0 . "INSERT"))))
      (setq Point (vl-remove-if 'listp(mapcar 'cadr(ssnamex objSet))))
      (setq ptLst(mapcar 'cdr (mapcar '(lambda(x)(assoc 10 x))(mapcar 'entget Point))))
      (setq objSet nil objSet(ssget "_X" (list '(0 . "*TEXT")(cons 410 (getvar "CTAB")))))
      )
  (progn
    (setq tmp1 (vl-remove-if 'listp(mapcar 'cadr(ssnamex objSet))))
    (setq tmp1 (mapcar '(lambda(x)(setq x (entget x))(list (cdr(assoc 10 x))(cdr(assoc 1 x)))) tmp1))
    (foreach pt ptlst
      (setq tmp2 (mapcar '(lambda(x)(list (distance pt (car x))(cadr x))) tmp1))
      (setq pat (car tmp2))
      (foreach dst tmp2 (if (< (car dst) (car pat))(setq pat dst)))
      (setq txtZList (cons (cadr pat) txtZList))
      )
    (setq txtZList (reverse txtZList))
    (setq txtZList (mapcar '(lambda(x)
                    (vl-string-translate "," "." (vl-string-trim  "%UuoOcC \t"   x))
                   )txtZList))
    (mapcar '(lambda(ptObj pt Z)
               (vla-put-insertionpoint (vlax-ename->vla-object ptObj)
                (vlax-3d-point (list (car pt)(cadr pt) Z))
               )
               )
           Point ptLst (mapcar 'atof txtZList)
            )
    )
  )
  (vla-EndUndoMark (vla-get-activedocument (vlax-get-acad-object)))
  (princ)
  )
Необходимо это, потому что ближайшим может оказаться текст, не принадлежащий к данному блоку. А если будет заполняться атрибут блока, то можно сразу будет отслеживать та ли отметка заполнилась в блок.

2. А, вообще, в идеале опишу свою задачу так. Есть геоподоснова, где каждому блоку (кружочку с заливкой) соответствует текст, содержащий высотную отметку. Но не на строго выверенном расстоянии, а от балды. Нужно заполнить Z-блока из данного текста, но тоже хитро:
1. У одного блока могут стоять сразу две отметки (верх и низ борта -выбрать нужно низ - т.е. меньшую)
2. Ближайшей может оказаться не так текстовая отметка.
В идеале вижу решение задачи следующим образом.
1. Задается расстояние сканирования (допустим 5).
2. Выбираются блоки.
3. Дальше вокруг блока сканируется расстояние на площади описанного круга с радиусом равным расстоянию сканирования. Если в этот предел попадает одна отметка - то и её назначаем отметкой Z и записываем это значение в атрибут блока. Если две и больше - красим точку в красный и переводим пользовательский экран в это место с диалогом ввода этой отметки.

Заранее спасибо

Последний раз редактировалось Ancient John, 16.08.2010 в 11:13.
Просмотров: 4256
 
Непрочитано 16.08.2010, 11:19
#2
Дима_

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


Еще раз в чем вопрос как поменять цвет у блока и аттрибут?
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 16.08.2010, 11:23
#3
Ancient John


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


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Еще раз в чем вопрос как поменять цвет у блока и аттрибут?
1. Дополнить программу так, чтобы она ещё меняла цвет блока и текстовый атрибут внутри блока на значение Z координаты этого блока, полученной из рядом стоящего текста.

2. Написать новую программу по описанному алгоритму. Не обязательно, но желательно.\

Я так понимаю, что никто мне помочь не хочет?

Последний раз редактировалось Ancient John, 16.08.2010 в 22:31.
Ancient John вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 17.08.2010, 20:24
#4
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Ancient John Посмотреть сообщение
чтобы она ещё меняла цвет блока и текстовый атрибут внутри блока на значение Z координаты этого блока, полученной из рядом стоящего текста.
...
Я так понимаю, что никто мне помочь не хочет?
Похоже на то, что присылают моим пользователям (тем которые дорожники). Только они меня просили как раз об обратном. Здесь можно глянуть.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 17.08.2010, 22:31
#5
Ancient John


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


Цитата:
Сообщение от hwd Посмотреть сообщение
Похоже на то, что присылают моим пользователям (тем которые дорожники). Только они меня просили как раз об обратном. Здесь можно глянуть.
Да, когда искал в интернете находил вашу программу Просто это реально без надобности, т.к. в Civil можно задать блок с атрибутом за точку. Вообщем - он эту задачу выполняет сам без дополнительных программ. Единственное, не заменяя на 3D Point.

А у меня вот на руках сейчас блок с отметкой рядом, блок без атрибута И чтобы каждому блоку (около 10 000) задать координату Z по тексту, да и проверить это проверяя в Свойствах - недели не хватит.
Ancient John вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 26.01.2018, 14:38
#6
config


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


Доброго времени суток! Хотел спросить, может по прошествии времени кто-нибудь нашел решение этой давней проблемы? До сих пор не дает покоя (я думаю и не только мне) проблема присвоение высоты блоку из отметки значения атрибута в топографии. Образец блока прикладываю. Спасибо!
Вложения
Тип файла: dwg
DWG 2007
PICKET.dwg (359.3 Кб, 10 просмотров)
config вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 26.01.2018, 14:59
#7
trir


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


Цитата:
Хотел спросить, может по прошествии времени кто-нибудь нашел решение этой давней проблемы? До сих пор не дает покоя (я думаю и не только мне) проблема присвоение высоты блоку из отметки значения атрибута в топографии.
смешной
trir на форуме вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 26.01.2018, 15:17
#8
config


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


Цитата:
Сообщение от trir Посмотреть сообщение
смешной
Спасибо за отзывчивость. Но я веду речь о чистом AutoCAD.
config вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 26.01.2018, 15:31
#9
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 1,740


Цитата:
Сообщение от config Посмотреть сообщение
Хотел спросить, может по прошествии времени кто-нибудь нашел решение этой давней проблемы?
Судя по датам, кому нужно было, тот эту задачу решил, но видимо не посчитал нужным выложить в сеть.

Цитата:
Сообщение от config Посмотреть сообщение
До сих пор не дает покоя (я думаю и не только мне) проблема присвоение высоты блоку из отметки значения атрибута в топографии.
За почти 8 лет Вы наверное предприняли массу действий для решения этой задачи, а потому начну сначала:
На каком языке пытаетесь решить свою задачу, под какую версию автокада, что уже сделали, что не получается?
__________________
_бложиг
Boxa вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 26.01.2018, 15:55
#10
config


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


Цитата:
Сообщение от Boxa Посмотреть сообщение
что уже сделали, что не получается?
Да в том-то и дело, что к большому сожалению я не программист. Поэтому и вопрошаю у сведущих. Может у кого-то есть решение и может поделиться. Или указать ссылку, где вопрос решен.
Цитата:
Сообщение от Boxa Посмотреть сообщение
На каком языке пытаетесь решить свою задачу, под какую версию автокада
В соответствии с темой.
config вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 26.01.2018, 22:26
1 | #11
VVA

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


config, Тестируй
Код:
[Выделить все]
(defun C:ZBLATT ( / blname tagname round  objSet *error*)
;_Приcвоение аттрибуту значение Z точки вставки блока
(vl-load-com)
(defun *error*(msg)(princ msg)
(vla-EndUndoMark (vla-get-activedocument (vlax-get-acad-object)))(princ))
(vla-StartUndoMark (vla-get-activedocument (vlax-get-acad-object)))
(vla-StartUndoMark (vla-get-activedocument (vlax-get-acad-object)))  
(setq blname  "*"  ;_Block name. "*" - any
      tagname "OTMETKA" ;_Tag Z value
      round   3         ;_ Round Z value to 3 digit
      )
  (and
      (setq objSet(ssget "_:L" (list (cons 0 "INSERT")(cons 2 blname))))
      (setq Lst (vl-remove-if 'listp(mapcar 'cadr(ssnamex objSet))))
      (foreach bl Lst
      (lm:vl-setattributevalue
        (vlax-ename->vla-object bl) ;_[vla] VLA Block Reference Object
        tagname                     ;_[str] Attribute TagString 
        (rtos (caddr(cdr(assoc 10 (entget bl)))) 2 round) ;_[str] Attribute Value
      )
      )
      )
  (vla-EndUndoMark (vla-get-activedocument (vlax-get-acad-object)))
  (princ)
  )
;; Set Attribute Value  -  Lee Mac
;; Sets the value of the first attribute with the given tag found within the block, if present.
;; blk - [vla] VLA Block Reference Object
;; tag - [str] Attribute TagString
;; val - [str] Attribute Value
;; Returns: [str] Attribute value if successful, else nil.
(defun LM:vl-setattributevalue ( blk tag val )
    (setq tag (strcase tag))
    (vl-some
       '(lambda ( att )
            (if (= tag (strcase (vla-get-tagstring att)))
                (progn (vla-put-textstring att val) val)
            )
        )
        (vlax-invoke blk 'getattributes)
    )
)
(princ "\nType ZBLATT in command line")(princ)
Прочитал внимательнее, похоже требуется обратная задача
Код:
[Выделить все]
(defun C:ATTZBL (/ blname tagname round objSet *error*)
 ;_Приcвоение высоты блоку из отметки значения атрибута
  (vl-load-com)
  (defun *error* (msg)
    (princ msg)
    (vla-endundomark
      (vla-get-activedocument (vlax-get-acad-object))
    ) 
    (princ)
  ) 
  (vla-startundomark
    (vla-get-activedocument (vlax-get-acad-object))
  ) 
  (vla-startundomark
    (vla-get-activedocument (vlax-get-acad-object))
  ) 
  (setq blname  "*"  ;_Block name. "*" - any
        tagname "OTMETKA" ;_Tag Z value
  ) 
  (and
    (setq objSet (ssget "_:L" (list (cons 0 "INSERT") (cons 2 blname))))
    (setq Lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex objSet))))
    (foreach bl Lst
      (setq pt (cdr(assoc 10 (entget bl))))
      (vla-put-insertionpoint
        (vlax-ename->vla-object bl)
        (vlax-3d-point
          (list (car pt)(cadr pt)
          (atof
            (vl-string-translate
              ","
              "."
              (vl-string-trim
                "%UuoOcC \t"
                (LM:vl-getattributevalue
                  (vlax-ename->vla-object bl) ;_[vla] VLA Block Reference Object
                  tagname                     ;_[str] Attribute TagString 
                ) 
              ) 
            ) 
          )
          )      
        ) 
      ) 
    ) 
  ) 
  (vla-endundomark
    (vla-get-activedocument (vlax-get-acad-object))
  ) ;_ end of vla-EndUndoMark
  (princ)
) ;_ end of defun
;; Get Attribute Value  -  Lee Mac
;; Returns the value held by the specified tag within the supplied block, if present.
;; blk - [vla] VLA Block Reference Object
;; tag - [str] Attribute TagString
;; Returns: [str] Attribute value, else nil if tag is not found.
(defun LM:vl-getattributevalue ( blk tag )
    (setq tag (strcase tag))
    (vl-some '(lambda ( att ) (if (= tag (strcase (vla-get-tagstring att))) (vla-get-textstring att))) (vlax-invoke blk 'getattributes))
)
(princ "\nType ATTZBL in command line")(princ)
Вложения
Тип файла: dwg
DWG 2013
testfile.dwg (83.2 Кб, 10 просмотров)
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 15.02.2018 в 18:12.
VVA вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 26.01.2018, 22:43
#12
config


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


Цитата:
Сообщение от VVA Посмотреть сообщение
config, Тестируй
Супер! Все работает как надо! Вопрос снят! Спасибо Вам огромное!

----- добавлено через ~19 мин. -----
Цитата:
Сообщение от VVA Посмотреть сообщение
Прочитал внимательнее, похоже требуется обратная задача
Нет, именно так. Но и второй вариант лиспа (приcвоение высоты блоку из отметки значения атрибута) тоже будет очень кстати. Еще раз огромное Вам спасибо!
config вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 26.01.2018, 23:04
#13
VVA

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


config, А мне показалось после второго прочтения, что нужна обратная задача. Короче, обновил #11 - Zblk->значение атрибута и значение атрибута ->Zblk

----- добавлено через ~1 мин. -----
PS Похоже, онлайн общаемся
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 27.01.2018, 00:00
#14
config


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


Цитата:
Сообщение от VVA Посмотреть сообщение
config, А мне показалось после второго прочтения, что нужна обратная задача. Короче, обновил #11 - Zblk->значение атрибута и значение атрибута ->Zblk
Да нет, это я, мягко говоря, не совсем точно изложил проблему. Тема ведь как раз присвоение блоку значения атрибута.
Цитата:
Сообщение от VVA Посмотреть сообщение
PS Похоже, онлайн общаемся
config вне форума вставить имя Обратить внимание модератора на это сообщение  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp. Присвоение блоку атрибута и Z из текста.

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

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

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Вставка в таблицу поля, соотвествующего площади примитива Profan Готовые программы 261 04.05.2018 12:45
LISP. Выравнивание текста по двум точкам. Krieger Готовые программы 10 24.12.2011 16:02
как редактировать contents в свойствах текста? как привязать размер текста атрибута к размеру блока? p-sm AutoCAD 3 13.08.2009 18:08
Изменение форматированного текста посредством lisp Tramp LISP 4 03.03.2006 11:28
Lisp для текста Vova LISP 11 13.05.2004 17:39

|| Главная || Каталог САПР || Тендеры || Публикации || Объявления || Биржа труда || Download || Галерея ||
|| Библиотека || Кунсткамера || Каталог предприятий || Контакты || Файлообменник || Блоги ||