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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как задать у размера "text fill color -> background"

Как задать у размера "text fill color -> background"

Ответ
Поиск в этой теме
Непрочитано 28.06.2010, 14:04 #1
Как задать у размера "text fill color -> background"
+Alex+
 
Архитектура
 
Регистрация: 05.03.2005
Сообщений: 96

Здравствуйте!
Имеется набор размеров. Как выставить програмно у этих размеров "text fill color" в положение "background"?
Спасибо, всем кто откликнется.
Просмотров: 3347
 
Непрочитано 28.06.2010, 14:48
#2
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
(vl-load-com)

(defun _dwgru-backgrn-dim (bit / adoc selset err mt blocks)
          ; bit -> nil - не закрашивать, t - закрашивать

  (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
  (setq blocks (vla-get-blocks adoc))
  (if (= (type (setq selset (vl-catch-all-apply
                              (function
                                (lambda ()
                                  (ssget '((0 . "DIM*")))
                                  ) ;_ end of lambda
                                ) ;_ end of function
                              ) ;_ end of vl-catch-all-apply
                     ) ;_ end of setq
               ) ;_ end of type
         'pickset
         ) ;_ end of =
    (foreach ent ((lambda (/ item tab)
                    (repeat (setq tab  nil
                                  item (sslength selset)
                                  ) ;_ end setq
                      (setq tab (cons (ssname selset (setq item (1- item))) tab))
                      ) ;_ end repeat
                    ) ;_ end of lambda
                  )
      (if (vl-catch-all-error-p
            (setq err (vl-catch-all-apply
                        (function
                          (lambda ()
                            (vla-put-backgroundfill
                              (setq mt (car
                                         (vl-remove-if-not
                                           (function
                                             (lambda (x)
                                               (wcmatch (strcase (vla-get-objectname x)) "*MTEXT*")
                                               ) ;_ end of lambda
                                             ) ;_ end of function
                                           ((lambda (/ res)
                                              (vlax-for ent (vla-item blocks (cdr (assoc 2 (entget ent))))
                                                (setq res (cons ent res))
                                                ) ;_ end of vlax-for
                                              res
                                              ) ;_ end of lambda
                                            )
                                           ) ;_ end of vl-remove-if-not
                                         ) ;_ end of car
                                    ) ;_ end of setq
                              (if bit
                                :vlax-true
                                :vlax-false
                                ) ;_ end of if
                              ) ;_ end of vla-put-backgroundfill
                            ) ;_ end of lambda
                          ) ;_ end of function
                        ) ;_ end of VL-CATCH-ALL-APPLY
                  ) ;_ end of setq
            ) ;_ end of VL-CATCH-ALL-ERROR-P
        (princ (strcat "\n ** error ** : " (vl-catch-all-error-message err)))
        ) ;_ end of if
      ) ;_ end of foreach
    ) ;_ end of if
  (vla-regen adoc acallviewports)
  ) ;_ end of defun
Примеры вызова
Код:
[Выделить все]
(_dwgru-backgrn-dim t)
(_dwgru-backgrn-dim nil)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 28.06.2010, 14:55
#3
+Alex+

Архитектура
 
Регистрация: 05.03.2005
Сообщений: 96


kpblc Огромное спасибо, я совсем упустил что есть vla-get-backgroundfill и vla-put-backgroundfill.
+Alex+ вне форума  
 
Непрочитано 28.06.2010, 14:56
#4
Кулик Алексей aka kpblc
Moderator

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


Только у объекта размера такого свойства нет И с обновлением я сходу не разобрался, сделал по-душмански. А так-то все действительно достаточно просто.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 28.06.2010, 15:03
#5
+Alex+

Архитектура
 
Регистрация: 05.03.2005
Сообщений: 96


Цитата:
Только у объекта размера такого свойства нет...
поэтому я ничего и не нашел.
+Alex+ вне форума  
 
Непрочитано 21.05.2012, 01:29
#6
skkkk


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


Битый час изучал дамп размеров на предмет изменения значений при включении text fill color -> background (заливка фоном, маска размера). Vla-put-TextFill и vla-put-TextFillColor в разных комбинациях давали какие угодно результаты кроме заливки фоном. Пошел в поиск - нашел эту тему. Ознакомился с кодом из #2. Как я понял, каким-то образом размер в нём обрабатывается как мтекст. Поразился. Протестировал. Выяснил, что он имеет некоторые неудобства. Во-первых, слишком высок коэффициент перекрытия заднего плана, и маска закрывает размерную линию. Во-вторых, при любых манипуляциях с размером маска слетает (тестировал на AutoCAD 2011).
Нашел тему на англоязычном форуме. Приведу здесь выдержки из нее.
Для AutoCAD 2007-2008 должно работать следующее (не тестировал, т.к. нет под рукой этих версий):
Обрабатывает последний созданный размер:
Код:
[Выделить все]
;BML Last dimension

(defun c:bml (/ object)
(vl-load-com)
(if
(and
(setq object (entlast))
(setq object (vlax-ename->vla-object object))
(wcmatch (vla-get-objectname object) "AcDb*Dimension"))
(progn
(if (= :vlax-true (vla-get-textfill object))
(vla-put-textfill object :vlax-false)
(vla-put-textfill object :vlax-true))))
(princ))
Обрабатывает выбранные размеры:
Код:
[Выделить все]
;BMS Selected dimension

(defun c:bms (/ object)
(vl-load-com)
(if
(and
(setq lst (entsel "\nselect dimension:"))
(setq object (car lst))
(setq object (vlax-ename->vla-object object))
(wcmatch (vla-get-objectname object) "AcDb*Dimension"))
(progn
(if (= :vlax-true (vla-get-textfill object))
(vla-put-textfill object :vlax-false)
(vla-put-textfill object :vlax-true))))
(princ))
Но в 2009-м и выше эти коды не работают.
Дамп одного и того же размера в 2008-м дает:
; TextFill = -1
; TextFillColor = 0
а в 2009-м:
; TextFill = 0
; TextFillColor = 1.
Автор англотопика приводит свое решение для 2009-го
Код:
[Выделить все]
;BML   Last dimension

(defun c:bml ( / dim ent xdata prec newxdata newent)
  
(setq dim (entlast))
(setq ent (entget dim '("ACAD")))
(setq xdata (assoc -3 ent))

(if xdata
(progn
(setq prec (nth 4 (last xdata)))
(setq newxdata (list (list '-3 (list '"ACAD" '(1000 . "DSTYLE") '(1002 . "{") '(1070 . 271) prec '(1070 . 69) '(1070 . 1) '(1002 . "}")))))
(setq newent (append (entget dim) newxdata)))
  
(progn
(setq newxdata '((-3 ("ACAD" (1000 . "DSTYLE") (1002 . "{") (1070 . 69) (1070 . 1) (1002 . "}")))))
(setq newent (append ent newxdata))))

(entmod newent)
(princ))

;BMS   Selected dimension

(defun c:bms ( / dim ent xdata prec newxdata newent)
  
(setq dim (car (entsel "\nSelect dimension:")))
(setq ent (entget dim '("ACAD")))
(setq xdata (assoc -3 ent))

(if xdata
(progn
(setq prec (nth 4 (last xdata)))
(setq newxdata (list (list '-3 (list '"ACAD" '(1000 . "DSTYLE") '(1002 . "{") '(1070 . 271) prec '(1070 . 69) '(1070 . 1) '(1002 . "}")))))
(setq newent (append (entget dim) newxdata)))
  
(progn
(setq newxdata '((-3 ("ACAD" (1000 . "DSTYLE") (1002 . "{") (1070 . 69) (1070 . 1) (1002 . "}")))))
(setq newent (append ent newxdata))))

(entmod newent)
(princ))
Но этот код сносит расширенные данные, если размер ими обладает. Как оказалось, группы (1070 . 77) и (1070 . 4) появляются при смене вертикального выравнивания (т.е это расширенные данные?), и соответственно код возвращает выравнивание по умолчанию.
Я обошел это так
Код:
[Выделить все]
(cond 
    ((or(= (vla-get-verticaltextposition (vlax-ename->vla-object (ssname (ssget "_I") 0))) 1)
        (= (vla-get-verticaltextposition (vlax-ename->vla-object (ssname (ssget "_I") 0))) 3)
     )
     (progn (setq le (entget (ssname (ssget "_I") 0)))
            (setq le (append le '((-3 ("ACAD" (1000 . "DSTYLE")(1002 . "{") (1070 . 69) (1070 . 1) (1002 . "}"))))))
            (entmod le)
     )
    )
    ((= (vla-get-verticaltextposition (vlax-ename->vla-object (ssname (ssget "_I") 0))) 4)
     (progn (setq le (entget (ssname (ssget "_I") 0)))
            (setq le (append le '((-3 ("ACAD" (1000 . "DSTYLE")(1002 . "{") (1070 . 69) (1070 . 1) (1070 . 77) (1070 . 4) (1002 . "}"))))))
            (entmod le)
     )
    )
)
Таким образом я избежал возврата вертикального выравнивания. Это конкретный случай. Также слетают и другие настройки, если они были сделаны через панель свойств или через (vla-put-...)/ И надо анализировать все расширенные свойства размера и при добавлении групп (1070 . 69) (1070 . 1) надо добавить еще и те группы которые появились при назначении размеру свойств. Не знаю, глюк ли это АвтоКАДа или некая специфика, но голова закипает
skkkk вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как задать у размера "text fill color -> background"

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Viewport и как задать масштаб для начинающих N.G. AutoCAD 17 01.04.2010 13:24
Как задать плотность материала в AutoCAD Stepan40 AutoCAD 16 18.01.2010 11:35
как задать точный радиус полилинии? uyka AutoCAD 18 12.10.2009 13:46
Мониторы LCD CRT Разное 94 17.06.2008 10:51