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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Разнос налезающих друг на друга размеров по свободным местам

Разнос налезающих друг на друга размеров по свободным местам

Ответ
Поиск в этой теме
Непрочитано 03.11.2020, 11:20 #1
Разнос налезающих друг на друга размеров по свободным местам
dextron3
 
проектировшик
 
СССР
Регистрация: 01.01.2007
Сообщений: 5,143

Приветствую
Собственно вопрос я так понял средствами автокада не решается, они просто не видят цепочку размеров, хотел поинтерсоваться, с помощью лисп программирования решили данный вопрос, просто помню лет 10 назад поднимал данную тему, предлагали разносить размеры по уровням, но я так понял не совсем то что хотелось, на скриншоте проблема и результат решения...

алгоритм следующий разносить выноски размеров так чтобы текст не налезал друг на друга, ну в идеале и на другие примитивы автокада (линии, тексты, полилинии), а воносилось на ближайшую свободную область для помещения цифрового значения


заранее благодарен если такое уже было и меня отправят в нужном направлении

----- добавлено через ~4 мин. -----
Алгоримт лиспа следующий, он анализирует вокруг существующего текста пустые области, и в ближайшую выносит размерную выноску с текстом, и так по порядку, слева на право сверху вниз для всех размерных линий, выбрать размеры нажать ок и он все это автоматом сканирует и преобразовывает, понимаю из области фантастики, но, а вдруг возможно

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

Миниатюры
Нажмите на изображение для увеличения
Название: Захват72.jpg
Просмотров: 276
Размер:	83.6 Кб
ID:	231520  

__________________
инженер проектировшик с опттом программа авто гад образование высшие

Последний раз редактировалось dextron3, 03.11.2020 в 11:26.
Просмотров: 3263
 
Непрочитано 03.11.2020, 15:01
#2
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,041


по несколько раз в год всплывают подобные темы - автоматический разнос размеров, выносок и т.п. по свободному пространству... Автомат все равно не получится, поскольку даже человеческий мозг периодически "подвисает" в процессе выбора компоновки густонасыщенного чертежа, больше на полуинтуитивном уровне процесс идет.
Сергей812 вне форума  
 
Непрочитано 06.11.2020, 10:31
#3
Boxa

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


ИМХО, это возможно до определенной степень, но нанять студента дешевле и он справится с работой быстрее.
https://ru.wikipedia.org/wiki/%D0%93...B8%D1%82%D0%BC или что то подобное....
Boxa вне форума  
 
Непрочитано 06.11.2020, 12:25
#4
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от dextron3 Посмотреть сообщение
Алгоримт лиспа следующий, он анализирует вокруг существующего текста пустые области, и в ближайшую выносит размерную выноску с текстом, и так по порядку, слева на право сверху вниз для всех размерных линий, выбрать размеры нажать ок и он все это автоматом сканирует и преобразовывает, понимаю из области фантастики, но, а вдруг возможно
Да, это из области фантастики. Возможно, но очень трудоёмко и долго:
  • придумать алгоритмы поиска объектов вокруг
  • механизмы определения пустого места
  • определения оптимального положения с учётом того, что выноска может быть направлена в разные стороны и выносной линией тоже что-то пересекать
  • и т.д. и т.п.
Потом это долго прогонять, отлаживать, дописывать условия в алгоритм. В итоге, получится что-то такое монструозное на несколько тысяч строк кода, которое будет долго и нестабильно работать. Потом надо будет взяться, заново пересмотреть алгоритмы, оптимизировать. И, возможно, получится то, что хочется. А может быть и нет.

Я недавно решал похожую задачу. Мне нужно было программно проставить размеры и исключить такие вот "налезания". Я ограничился размещением только относительно размеров цепочки, налезание на другие объекты чертежа не отслеживал. В таком, более простом варианте алгоритм примерно такой:
Если текущий размер меньше значения, при котором число помещается без полочки, то смотрим, есть ли такие "маленькие" размеры до или после в цепочке.
Если нет, или есть "до", но нет "после" - делаем размер на полочке, выводим выноску вправо и на высоту 1 х (высота текста размера * коэффициент).
Если нет "до", но есть "после" - то же самое, но размер выводится влево.
Если есть и "до" и "после", то определяется, сколько таких размеров "после" (допустим их N). Размер делается на полочке вправо на высоте (N + 1) х (высота текста размера x коэффициент). Коэффициент - чтобы был небольшой промежуток по вертикали между выносками в одну сторону.
Дополнительно, я добавил скрытие заднего фона для текста размера, если он куда-то налезет поверх другого объекта чертежа. Ну а дальше - уже проектировщик руками подвинет, если нужно будет.
Если по такому алгоритму, то это относительно несложно реализуется.
Миниатюры
Нажмите на изображение для увеличения
Название: dim_chain.png
Просмотров: 113
Размер:	12.4 Кб
ID:	231634  
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Автор темы   Непрочитано 06.11.2020, 14:15
#5
dextron3

проектировшик
 
Регистрация: 01.01.2007
СССР
Сообщений: 5,143


Можно и так, я вот до сих пор не пойму почему разработчики автодеск ничего в этом плане не придумывают, в ревите так же потом сидишь и размеры гоняешь по листам, это же всем понятно что нужно интеллектуально на многоуровневые ступени раздвигать, ан нет, я то в 2011 автокаде работаю может в 2021 уже это реализовано, это же старая многолетняя хроническая проблема, которая похоронит автокад
__________________
инженер проектировшик с опттом программа авто гад образование высшие
dextron3 вне форума  
 
Непрочитано 06.11.2020, 14:44
#6
trir


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


неронку натаскать
trir вне форума  
 
Непрочитано 06.11.2020, 17:31
#7
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,680


dextron3, а размеры под красным крестом как появляются? это ручная работа или автоматическая?
koMon вне форума  
 
Непрочитано 06.11.2020, 17:40
#8
AlexCondor

инженер
 
Регистрация: 03.08.2007
Сообщений: 1,327


koMon, Судя по всему это QDIM. Очень похоже
AlexCondor вне форума  
 
Автор темы   Непрочитано 06.11.2020, 19:15
#9
dextron3

проектировшик
 
Регистрация: 01.01.2007
СССР
Сообщений: 5,143


Цитата:
Сообщение от koMon Посмотреть сообщение
dextron3, а размеры под красным крестом как появляются? это ручная работа или автоматическая?
это авторазмеры их можно автоматически ставить через _qdim, а можно в виде цепочки вручную...

----- добавлено через ~2 мин. -----
_qdim эта команда очень интересная на тупая до невозможности, иногда лучше вручную ставить и сразу правильно чем ее сначала, а потом корректировать, больше времени уходит...

----- добавлено через ~15 ч. -----
Вот было разнос размеров на разные уровни, но он не интеллектуально работает

Код:
[Выделить все]
;;;Пытается выровнять выноску Размера
;;; dim - ename or vla-object
;;; ang - angle 0 or pi угол в радианах
;;; Y - новое положение размерной линии  или nil  
;;; TextOverride - значение TextOverride или nil - не менять  
(defun dim-leader-vert-ang-Y-text (dim     ang     Y       TextOverride
                                   /       dimobj  blk     lst
                                   pt1     pt2     pt3     ptc
                                   pt_text
                                  )
  (if (= (type dim) 'vla-object)
    (setq dim (vlax-vla-object->ename dim))
  ) ;_ end of if
  (setq dimobj (vlax-ename->vla-object dim))
  (if (and
        (vlax-write-enabled-p dimobj)
        (wcmatch (vla-get-objectname dimobj)
                 "AcDbAlignedDimension,AcDbRotatedDimension"
        ) ;_ end of wcmatch
      ) ;_ end of and
    (progn
      (vla-put-textmovement dimobj acmovetextaddleader)
      (setq blk
             (vla-item (vla-get-blocks
                         (vla-get-activedocument (vlax-get-acad-object))
                       ) ;_ end of vla-get-Blocks
                       (cdr (assoc 2 (entget dim)))
             ) ;_ end of vla-item
      ) ;_ end of setq
      (setq lst nil)
      (vlax-for item blk
        (if (= (vla-get-objectname item) "AcDbBlockReference")
          (setq
            lst (cons
                  (vlax-safearray->list
                    (vlax-variant-value (vla-get-insertionpoint item))
                  ) ;_ end of vlax-safearray->list
                  lst
                ) ;_ end of cons
          ) ;_ end of setq
        ) ;_ end of if
        (if (= (vla-get-objectname item) "AcDbSolid")
          (progn
            (setq
              lst (cons
                    (vlax-safearray->list
                      (vlax-variant-value (vla-get-coordinate item 0))
                    ) ;_ end of vlax-safearray->list
                    lst
                  ) ;_ end of cons
            ) ;_ end of setq
          ) ;_ end of progn
        ) ;_ end of if
      ) ;_ end of vlax-for
      (if (and (car lst)
               (cadr lst)
          ) ;_ end of and
        (progn
          (setq delta (* (vla-get-textgap dimobj)
                         (vla-get-scalefactor dimobj)
                      ) ;_ end of *
          ) ;_ end of setq
          (setq pt1     (car lst)
                pt2     (cadr lst)
                ptc     (polar pt1 (angle pt1 pt2) (* 0.5 (distance pt1 pt2)))
                pt_text (vlax-safearray->list
                            (vlax-variant-value
                              (vla-get-textposition dimobj)
                            ) ;_ end of vlax-variant-value
                          ) ;_ end of vlax-safearray->list
                pt_text (if Y
                          (inters Y (polar Y (angle pt1 pt2) 1e3)
                                  pt_text (polar pt_text (+ (angle pt1 pt2) (* 0.5 pi)) 1e3)
                                  nil)
                         pt_text   
                        ) ;_ end of if
          ) ;_ end of setq
          (setq
            pt3 (inters pt_text
                        (polar pt_text (angle pt1 pt2) 1e3)
                        ptc
                        (polar ptc (+ (angle pt1 pt2) (* 0.5 pi)) 1e3)
                        nil
                ) ;_ end of inters
          ) ;_ end of setq
;;;          (setq pt3 (polar pt3 (+ ang (angle pt2 pt1)) delta))     ;;;Было
          (setq pt3 (polar pt3 (+ ang (angle pt3 pt_text)) delta))    ;;;Новое
          (vla-put-textposition dimobj (vlax-3d-point pt3))
          (if (= (type TextOverride) 'STR)
            (vla-put-textoverride dimobj TextOverride)
          ) ;_ end of if
        ) ;_ end of progn
      ) ;_ end of if
    ) ;_ end of progn
  ) ;_ end of if
) ;_ end of defun
  
;;;Dimention Leader Vertical
;;;Выравнивание выноски размера
;;;http://dwg.ru/f/showthread.php?t=15823
;;;Вертикальная выноска
;;;Порядок запросов
;;;-  Поправочный угол - 0 или 180 (зерклит выноску)
;;;-  Значение TextOverride - строка TextOverride или
;;;                              Enter - не менять или
;;;                              <> - снять установленный TextOverride
;;; - Обрабатывать размеры - 0 - все
;;;                          1 - нечетные
;;;                          2 - четные
;;; - Новое положение размерной линии - Enter - не менять
;;;Возможные варианты кнопок
;;;DLV0 - ^C^CDLV;0;;0;;
;;;DLV180 -  ^C^CDLV;180;<>;0;
;;;DLVY -  ^C^CDLV;0;;0;
;;;DLV1 - ^C^CDLV;0;;1;
;;;DLV2 - ^C^CDLV;0;;2
;;;DLVYT - ^C^CDLV;180;  ;0;;
;;;  
(defun C:DLV (/ pt ang what Isrus TextOverride ss lst mpt *error*)
  (defun *error* (msg)
    (princ msg)
    (vla-get-activedocument (vlax-get-acad-object))
  ) ;_ end of defun
  (vl-load-com)
  (vla-startundomark
    (vla-get-activedocument (vlax-get-acad-object))
  ) ;_ end of vla-StartUndoMark
  (setq Isrus (= (getvar "DWGCODEPAGE") "ANSI_1251"))
  (if (null (setq ang
                   (getangle
                     (if Isrus
                       "\nПоправочный угол к размерной выноске (0 или 180) <0>: "
                       "\nCorrection angle to dimetsion leader (0 or 180) <0> :"
                     ) ;_ end of if
                   ) ;_ end of getangle
            ) ;_ end of setq
      ) ;_ end of null
    (setq ang 0)
  ) ;_ end of if
  (setq TextOverride
         (getstring t
                    (if Isrus
                      "\nЗначение TextOverride <не менять>: "
                      "\nTextOverride value <don't change>: "
                    ) ;_ end of if
         ) ;_ end of getstring
  ) ;_ end of setq
  (if (= TextOverride "")
    (setq TextOverride nil)
  ) ;_ end of if
  (if Isrus
    (initget
      "Все Нечетный Четный All Odd Even 0 1 2 _0 1 2 0 1 2 0 1 2"
    ) ;_ end of initget
    (initget "All Odd Even 0 1 2 _0 1 2 0 1 2")
  ) ;_ end of if
;;; what - обрабатываемые размеры (process the dimension)
;;;    0 - все                    (all)
;;;    1 - нечетные               (odd)
;;;    2 - четные                 (even)
  (if (null (setq what
                   (getkword
                     (if Isrus
                       "\nОбрабатывать размеры [Все 0/Нечетные 1/Четные 2] <Все>: "
                       "\nTo process the dimension [All 0/Odd 1/Even 2] <All>: "
                     ) ;_ end of if
                   ) ;_ end of getkword
            ) ;_ end of setq
      ) ;_ end of null
    (setq what "0")
  ) ;_ end of if
  (setq pt (getpoint
             (if Isrus
               "\nНовое положение размерной линии <не менять>: "
               "\nNew position of dimension line <don't change>: "
             ) ;_ end of if
           ) ;_ end of getpoint
  ) ;_ end of setq
  (if pt (setq pt (trans pt 1 0)))
  (if Isrus
    (princ "\nВыберите размеры")
    (princ "\nSelect dimention")
  ) ;_ end of if
  (setq ss (ssget "_:L" '((0 . "DIMENSION"))))
  (setq i '-1)
  (repeat (sslength ss)
    (setq e1 (ssname ss (setq i (1+ i))))
    (if (member '(100 . "AcDbAlignedDimension") (entget e1))
      (setq lst (cons e1 lst))
    ) ;_ end of if
  ) ;_ end of repeat
  (setq ss nil)
  (if (/= what "0")
    (progn
      (setq what (= what "1"))
      (foreach x lst
        (setq mpt (cons (cdr (assoc 13 (entget x))) mpt))
      ) ;_ end of foreach
      (setq mpt (apply 'mapcar (cons 'list mpt)))
      (setq mpt (mapcar '(lambda (x) (apply 'min x)) mpt))
      (setq
        lst (vl-sort lst
                     '(lambda (x y)
                        (< (distance mpt (cdr (assoc 13 (entget x))))
                           (distance mpt (cdr (assoc 13 (entget y))))
                        ) ;_ end of <
                      ) ;_ end of lambda
            ) ;_ end of vl-sort
      ) ;_ end of setq
      (setq lst (vl-remove-if '(lambda (x) (setq what (not what))) lst))
    ) ;_ end of progn
  ) ;_ end of if
  (mapcar '(lambda (x)
             (dim-leader-vert-ang-Y-text x ang pt TextOverride)
           ) ;_ end of lambda
          lst
  ) ;_ end of mapcar
  (vla-endundomark
    (vla-get-activedocument (vlax-get-acad-object))
  ) ;_ end of vla-EndUndoMark
  (princ)
) ;_ end of defun
__________________
инженер проектировшик с опттом программа авто гад образование высшие
dextron3 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Разнос налезающих друг на друга размеров по свободным местам

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как разнести множество блоков на чертеже без наложения друг на друга? privetdruzia AutoCAD 14 02.11.2018 20:26
План в автокаде. Проверьте, пожалуйста! Сомнения на счет размеров. Они накладываются друг на друга. И как вообще план будет выглдеть на листе? Lilya AutoCAD 6 05.12.2010 21:17
Наложение отрезков друг на друга totalz AutoCAD 11 27.12.2009 18:59
Лисп - удаление наложенных друг на друга линий dextron3 LISP 5 08.10.2008 10:31
как построить обьекты на задонном растоянии друг от друга elias AutoCAD 6 06.11.2007 14:18