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

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

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

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

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

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


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

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

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

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

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

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


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


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

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


ИМХО, это возможно до определенной степень, но нанять студента дешевле и он справится с работой быстрее.
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
Просмотров: 66
Размер:	12.4 Кб
ID:	231634  
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Автор темы   Непрочитано 06.11.2020, 14:15
#5
dextron3

Фотограф
 
Регистрация: 01.01.2007
Алматы
Сообщений: 5,098


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


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


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


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


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

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


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

Фотограф
 
Регистрация: 01.01.2007
Алматы
Сообщений: 5,098


Цитата:
Сообщение от 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