1. ВНИМАНИЕ! В течении пары дней +- будет переезд форума на более защищённый сервер. Возможны периодические перебои в работе.

Помогу бесплатно разработать любую программу на autolisp.

Discussion in 'Autodesk' started by Германup, Feb 3, 2014.

  1. MrBrown

    MrBrown Форумчанин

    Приветствую всех на форуме!
    Можно ли на AutoLISP сделать из массива точек в модели что-то наподобие тепловой карты.
    Там, где концентрация точек большая, они (точки) коричневого цвета, где пореже - красного, ещё реже - оранжевого и т.д. до зелёного цвета.

    В приложенном файле - массив точек (Z=0).
    Требуется перебором закрасить каждую точку в нужный цвет в соответствии с расстоянием до ближайшей другой точки.
    Если расстояние менее 500 - коричневый цвет,
    501-600 - красный,
    601-700 - оранжевый,
    701-800 - жёлтый,
    801 и более - зелёный.
    Строки кода AutoLISP прошу закомментировать, не сочтите за большой труд (программистом не стану, но хоть что-то для себя почерпну).
     

    Attached Files:

  2. zvezdochiot

    zvezdochiot Форумчанин

    Неправильный "ответ". Диапазон надо задавать исходя из расстояния между наиболее удалёнными точками, или (что проще) из разности максимальных и минимальных координат в облаке точек, а так же их количества.
     
  3. MrBrown

    MrBrown Форумчанин

    Да я ума не приложу, как и что задавать, по какому алгоритму выполнить задачу.
     
  4. zvezdochiot

    zvezdochiot Форумчанин

    Дели координаты на некий dX и dY, округляй до целого и подсчитывай одинаковые. По полученной "карте" раскрашивай.

    PS: Можно и "усложнить". Сначала вычитать координаты текущей точки из остальных, потом только поделить, округлить и посчитать кол-во "нулевых".
     
  5. MrBrown

    MrBrown Форумчанин

    А возможно ли сделать так:
    от каждой точки (по очереди, в цикле) определять сначала окружность радиусом в 500мм и все другие точки, попавшие в этот круг, закрасить коричневым. Эти точки далее в цикле не участвуют, и цикл продолжается с другими точками, у которых окружность уже будет 600мм. Эти точки раскрасить красным.
    Потом цикл с оставшимися точками - круг 700мм, а точки в круге - раскрасить оранжевым и так до конца цикла.
     
  6. zvezdochiot

    zvezdochiot Форумчанин

    "Ручками" попробуй сначала. Ежели получится, то и лиспом сумеешь. Только выделять точки надо не "ручками", а командами. Сумеешь?
     
  7. MrBrown

    MrBrown Форумчанин

    "Сумеешь?" - теоретически. Ну, делать нечего, буду пробовать...
    Вот, набросал алгоритм (см. приложенный файл)
     

    Attached Files:

  8. trir

    trir Форумчанин

    zvezdochiot likes this.
  9. MrBrown

    MrBrown Форумчанин

    Спасибо, но я чего-то заморочился на AutoLISP сделать. Хотя сам ни бельмеса в нём.
    И ведь не для какой-то там важной задачи,а просто интересно стало: "А можно ли сваять такой макрос?"
     
  10. zvezdochiot

    zvezdochiot Форумчанин

  11. MrBrown

    MrBrown Форумчанин

    Народ, всех благодарю за рекомендации, за полезные ссылки. Завтра буду изучать. Всем спокойной ночи.
     
  12. trir

    trir Форумчанин

  13. zvezdochiot

    zvezdochiot Форумчанин

    По-русски нарисано: O(n*log(n))
     
  14. BearDyugin

    BearDyugin Модератор Форумчанин

    Code:
    (defun c:MrBrown (/       all_point   chek_point  border_list
      border      1_5_border  color       vla_point
      coord       pt_coord   pt_vla
     )
      (vl-load-com)
      (if
        (setq all_point (ssget "_X" (list (cons 0 "POINT"))))
         (progn
           (setq all_point  (mapcar
       (function (lambda (x / vla_point coord)
           (setq vla_point (vlax-ename->vla-object x)
         coord     (vlax-get vla_point 'Coordinates)
           )
           (list (list (car coord) (cadr coord))
         vla_point
           )
         )
       )
       (vl-remove-if
         'listp
         (mapcar 'cadr
         (ssnamex all_point)
         )
       )
     )
         chek_point  all_point
         border_list (list
       (list 500 34)
       (list 600 1)
       (list 700 30)
       (list 800 2)
     )
           )
           (foreach border border_list
     (setq
       color      (cadr border)
       border     (car border)
       1_5_border (* 1.5 border)
     )
     (foreach base_point all_point
       (setq
         coord (car base_point)
       )
       (foreach point chek_point
         (setq pt_coord    (car point)
       delta_coord (apply
     '+
     (mapcar 'abs (mapcar '- pt_coord coord))
           )
       pt_vla      (cadr point)
         )
         (if (and
       (<= delta_coord 1_5_border)
       (<= (distance pt_coord coord) border)
       (not (equal coord pt_coord))
     )
           (progn
     (setq chek_point (vl-remove point chek_point))
     (vla-put-color pt_vla color)
           )
         )
       )
     )
           )
           (mapcar (function (lambda (x)
       (vla-put-color (cadr x) 3)
     )
           )
           chek_point
           )
         )
      )
      (princ)
    )
    Комментировать лень, да и задач решена в лоб, без всяких там алгоритмов и триангуляций.
    На BricsCAD (он гораздо шустрее с LISP работает чем AutoCAD) твой файл за 5 минут переработало. Правда плотность там не высокая. почти все точки попали в максимальный диапазон
     
    Last edited: Oct 10, 2021
    flareon likes this.
  15. MrBrown

    MrBrown Форумчанин

    BearDyugin, спасибо, работает, но медленно в автокаде - ужас!
    Мне на DWG.RU создали вот такой макрос (см. вложение).
    Тоже работает, быстренько так.
    Может, кому-то пригодится.
     

    Attached Files:

  16. (XY)ёжик

    (XY)ёжик Форумчанин

    Приветствую всех! Нет ли у кого программки для создания выноски с абсолютной отметкой(или просто текст без выноски), которая вычисляется от заданного "нуля", а лучше от заданного значения. То есть, у меня на объекте сотни жб колонн эстакады с закладными деталями на гранях. Соответственно, все линейные размеры даны от низа колонны и на всю длину до каждой закладной. Отрисовал всё, четко по размерам. Считаю все отметки ручками, но немного надоело уже. Прошу помощи).
     
    Last edited: Jan 15, 2022
  17. Sergey B.

    Sergey B. Форумчанин

    Как вариант, можно скачать с сайта autodesk модуль СПДС. В этом модуле, в том числе, есть возможность создавать динамические отметки уровня. Однако, этот модуль не все геодезисты принимают, т.к. он создавался для проектирования и рассчитан на работу в чертежах с масштабом 1 единица чертежа = 1 метр, а не 1 единица чертежа = 1 миллиметр. Также, в версиях до 2019 - 2020 года встречались глюки, приводящие к Fatal error.
     
  18. zvezdochiot

    zvezdochiot Форумчанин

    Так считай в таблицах и жизнь покажется мёдом.
     
  19. (XY)ёжик

    (XY)ёжик Форумчанин

    В скорости выигрыша нет. У меня же и так все в размерах поэтому проще в самом акаде считать. Но геодезист же ленив и стремится автоматизировать или упростить работу.
    --- Сообщения объединены, Jan 15, 2022, Оригинальное время сообщения: Jan 15, 2022 ---
    Пробовал. Не то пальто. Но спасибо за отклик!
     
  20. zvezdochiot

    zvezdochiot Форумчанин

    То есть таблицами ты тоже пользоваться не умеешь? Однако.
     
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice