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

Тема в разделе "Autodesk", создана пользователем Германup, 3 фев 2014.

  1. MrBrown

    MrBrown Форумчанин

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

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

    Вложения:

    • Пятно+.dwg
      Размер файла:
      366,4 КБ
      Просмотров:
      5
  2. zvezdochiot

    zvezdochiot Форумчанин

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

    MrBrown Форумчанин

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

    zvezdochiot Форумчанин

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

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

    MrBrown Форумчанин

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

    zvezdochiot Форумчанин

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

    MrBrown Форумчанин

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

    Вложения:

  8. trir

    trir Форумчанин

    zvezdochiot нравится это.
  9. MrBrown

    MrBrown Форумчанин

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

    zvezdochiot Форумчанин

  11. MrBrown

    MrBrown Форумчанин

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

    trir Форумчанин

  13. zvezdochiot

    zvezdochiot Форумчанин

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

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

    Код:
    (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 минут переработало. Правда плотность там не высокая. почти все точки попали в максимальный диапазон
     
    Последнее редактирование: 10 окт 2021
    flareon нравится это.
  15. MrBrown

    MrBrown Форумчанин

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

    Вложения:

  16. ktyfh dfiubokdbxb

    ktyfh dfiubokdbxb Форумчанин

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

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

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

    zvezdochiot Форумчанин

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

    ktyfh dfiubokdbxb Форумчанин

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

    zvezdochiot Форумчанин

    То есть таблицами ты тоже пользоваться не умеешь? Однако.
     
  1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление
  1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление