Добро пожаловать!

Войдите или зарегистрируйтесь сейчас!

Войти

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

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

  1. ivsem

    Форумчанин

    Регистрация:
    26 мар 2009
    Сообщения:
    2.475
    Симпатии:
    1.051
    Адрес:
    Киев
    MrBrown, не знаю раскопали Вы или нет, но в программе допущена ошибка - глобальное переопределение функции *error*
    Переопределение же *error* должно быть локальным, то есть по нажатию клавиши Esc должны вернуться не только "старые" настройки системных переменных автокада,
    но и "старая" настройка-определение функции *error*. Попробовал сие реализовать в новой версии программы.
    Код:
    ;;;Версия 03  17.06.2019
     
    ;;;(defun *error* (errmsg)  Удалить функцию глобального переопределения *error* !
    ;;; (setvar "osmode" osmode_old)(princ)
    ;;;)
     
    (defun funError (errmsg)
     (setq *error* errorOLD)
     (setvar "osmode" osmode_old)
     (prompt "\nПовторний запуск программы-  11")
     (princ)
    )
    ;;;----------------------------------------------------------------
    (defun C:11 (/)
     (setvar "cmdecho" 0)(vl-load-com)
     
      (setq errorOLD *error*);  Добавленно в программу
      (setq *error* funError);  Добавленно в программу
     
     (setq osmode_old (getvar "osmode"))
      (While
       (setvar "osmode" 0)
       (setq Primitiv (car(entsel "\nВыберите мышкой текст-отметку  Выход-Esc  ")))
       (setq PrimitivDXF (entget Primitiv))
        (if (or(= (cdr(assoc 0 PrimitivDXF)) "TEXT")(= (cdr(assoc 0 PrimitivDXF)) "MTEXT"))
         (progn
          (setq Z$ (cdr(assoc 1 PrimitivDXF)))
         (if (wcmatch Z$ "#*")
           (progn
            (if (vl-string-position 44 Z$ )(setq Z$(vl-string-subst "." "," Z$)))
            (setq Z(atof Z$))
            (if(wcmatch Z$ "*@*")(command "_change" Primitiv "" "_P" "_C" 1 ""))
            (setvar "osmode" osmode_old)
            (setq XYmat (getpoint "\nУкажите мышкой точку : "))
            (setvar "osmode" 0)
            (command "_point" (list (car XYmat)(cadr XYmat)Z))
            (command "_change" Primitiv "" "_P" "_LA" (getvar "CLAYER") "")
           )
           (alert "\nВыбран текст без отметки!!!")
         )
        )
        (alert "\nЭто не текст!!!")
       )
     )
    )
    (C:11)
     
    #841
  2. MrBrown

    Форумчанин

    Регистрация:
    31 июл 2013
    Сообщения:
    35
    Симпатии:
    9
    ivsem, Нет, "error" я не заметил, а поменял "osmode" принудительно - перед выполнением макроса включил только нужные мне привязки, а после выполнения - вернул старые.

    Код:
    (defun C:12 (/)
      (setvar "cmdecho" 0)(vl-load-com)
      (setq osmode_old (getvar "osmode"))
       (While
        (setvar "osmode" 4096)
        (setq Primitiv (car(entsel "\nВыберите мышкой текст-отметку  Выход-Esc  ")))
       (setq PrimitivDXF (entget Primitiv))
         (if (or(= (cdr(assoc 0 PrimitivDXF)) "TEXT")(= (cdr(assoc 0 PrimitivDXF)) "MTEXT"))
         (progn
           (setq Z$ (cdr(assoc 1 PrimitivDXF)))
           (if (wcmatch Z$ "#*")
             (progn
            (if (vl-string-position 44 Z$ )(setq Z$(vl-string-subst "." "," Z$)))
           (setq Z(atof Z$))
             (if(wcmatch Z$ "*@*")(command "_change" Primitiv "" "_P" "_C" 1 ""))
             ;(setvar "osmode" osmode_old)
    (setvar "osmode" 37)
             (setq XYmat (getpoint "\nУкажите мышкой точку : "))
             (setvar "osmode" 4096)
             (command "_point" (list (car XYmat)(cadr XYmat)Z))
             (command "_change" Primitiv "" "_P" "_LA" (getvar "CLAYER") "")
             )
             (alert "\nВыбран текст без отметки!!!")
           )  
         )
         (alert "\nЭто не текст!!!")
         ) 
      )
    )
    (C:12)
     
    #842
  3. chehoff

    Форумчанин

    Регистрация:
    14 май 2012
    Сообщения:
    1.074
    Симпатии:
    186
    Адрес:
    Первый в мире, второй по Сибири
    Давно назревала просьба: В прилагаемом ДВГ линейный(параллельный)размер (проект\факт) Как заставить автокад, чтобы он красил числитель и знаменатель в разные цвета. Я обожаю черно белые чертежи, но все таки заставили сдавать ИД в цвете.
    --- Сообщения объединены, 22 июн 2019, Оригинальное время сообщения: 22 июн 2019 ---
    применяют вариант с сомещением размеров, где размер ставится вверху, а во втором внизу по вертикали, но это же ужасно)
     

    Вложения:

    #843
  4. Qvinto

    Форумчанин

    Регистрация:
    10 дек 2008
    Сообщения:
    5.681
    Симпатии:
    4.223
    Адрес:
    Украина, г.Калуш
    Антон, ТочностиНЕТ хорошая штука, но, можно и так пользоваться.

    антону.gif
     
    #844
    chehoff нравится это.
  5. chehoff

    Форумчанин

    Регистрация:
    14 май 2012
    Сообщения:
    1.074
    Симпатии:
    186
    Адрес:
    Первый в мире, второй по Сибири
    Qvinto, сделал так: двойной клик по размеру, который создан "Точности нет" далее ПКМ- "преобразовать размер в текст", далее можно разными цветами полученный Мтекст покрасить.
     
    #845
  6. Steinar

    Форумчанин

    Регистрация:
    30 авг 2012
    Сообщения:
    699
    Симпатии:
    496
    Адрес:
    Асгардия
    Помогите с программой, которая находит координаты основания перпендикуляра из точки на сплайн (на рисунке перпендикуляр из точки a).
    Программа должна сообщать если невозможно построить перпендикуляр (как для точки b).
    (Я не помню уже школьную программу - если что поправьте - такой перпендикуляр называется нормаль).

    Снимок.PNG
     
    #846
  7. ivsem

    Форумчанин

    Регистрация:
    26 мар 2009
    Сообщения:
    2.475
    Симпатии:
    1.051
    Адрес:
    Киев
    Какова конечная цель программы? Сформировать ведомость координат проекций точек на кривую?
     
    #847
  8. Steinar

    Форумчанин

    Регистрация:
    30 авг 2012
    Сообщения:
    699
    Симпатии:
    496
    Адрес:
    Асгардия
    Нет) Это будет часть алгоритма, который определяет с какой стороны от сплайна находится точка.
     
    #848
  9. ivsem

    Форумчанин

    Регистрация:
    26 мар 2009
    Сообщения:
    2.475
    Симпатии:
    1.051
    Адрес:
    Киев
    Код:
    (vl-load-com)
       (setq PrimitivSpline (car(entsel "\nВыберите сплайн" )))
       (setq PrimitivPoint (car(entsel "\nВыберите точку" )))
       (setq XYmatPoint (cdr(assoc 10 (entget PrimitivPoint))))
       (setq XYmatPointOnSpline  (vlax-curve-getClosestPointTo (vlax-ename->vla-object PrimitivSpline) XYmatPoint t))
       (command "_line" XYmatPoint XYmatPointOnSpline "")
    Если "кривая" - отрезок, то при выходе точек за пределы отрезка перпендикуляры строятся до пересечения с продолжением отрезка.
    Если "кривая" плиния, сплайн, то при выходе точек за пределы "кривой" перпендикуляры
    перестают быть оными и попадают в конечную (начальную) точку кривой.
     
    #849
    Последнее редактирование: 28 июн 2019
  10. Steinar

    Форумчанин

    Регистрация:
    30 авг 2012
    Сообщения:
    699
    Симпатии:
    496
    Адрес:
    Асгардия
    То есть в первом случае отрезок продолжается, а во втором просто находится ближайшая точка на сплайне (GetClosestPointTo).
    Это легко. Но здесь обязательно нужно проверять ситуацию на возможность построения перпендикуляра к кривой -
    если в первом случае можно просто выполнять проверку на принадлежность основания перпендикуляра отрезку,
    то в случае сплайна так не получится - здесь у меня сложности и пока ничего придумать не могу.
     
    #850
  11. Alexandr-GR

    Форумчанин

    Регистрация:
    9 июн 2011
    Сообщения:
    1.192
    Симпатии:
    945
    Адрес:
    Новосибирск
    Steinar, может через параметр кривой vlax-curve-getParamAtPoint искать некую 3-ю точку, скажем +0.1 или -0.1 к параметру точки полученной через GetClosestPointTo, затем проверять угол этих трех точек на равенство 90гр.. единственное надо подумать над условием в начале и конце кривой + или -
     
    #851
  12. ivsem

    Форумчанин

    Регистрация:
    26 мар 2009
    Сообщения:
    2.475
    Симпатии:
    1.051
    Адрес:
    Киев
    Код:
    (vl-load-com)
     (setq PrimitivSpline (car(entsel "\nВыберите сплайн" )))
     (setq VlaPrimitivSpline (vlax-ename->vla-object PrimitivSpline))
     (setq PrimitivPoint (car(entsel "\nВыберите точку" )))
     (setq XYmatPoint (cdr(assoc 10 (entget PrimitivPoint))))
     (setq XYmatPointOnSpline(vlax-curve-getClosestPointTo VlaPrimitivSpline XYmatPoint))
     (setq XYmatStartPointOnSpline (vlax-curve-getStartPoint VlaPrimitivSpline))
     (setq XYmatEndPointOnSpline (vlax-curve-getEndPoint VlaPrimitivSpline))
     (if (or(equal XYmatPointOnSpline XYmatStartPointOnSpline)(equal XYmatPointOnSpline XYmatEndPointOnSpline))
          (alert "Точка за пределом сплайна")
          (command "_line" XYmatPoint XYmatPointOnSpline "")
     )
    Вероятность того, что проекция случайной точки попадет точно на конец-начало сплайна практически не вероятна.
    Но можно ввести анализ и на такой "невероятный" случай.
     
    #852
    Последнее редактирование: 29 июн 2019
  13. ivsem

    Форумчанин

    Регистрация:
    26 мар 2009
    Сообщения:
    2.475
    Симпатии:
    1.051
    Адрес:
    Киев
    Код:
     (vl-load-com)
     (setq PrimitivSpline (car(entsel "\nВыберите сплайн" )))
     (setq VlaPrimitivSpline (vlax-ename->vla-object PrimitivSpline))
     (prompt "\nВыберите точки")
     (setq NaborPrimitivPoint (ssget '((0 . "POINT"))))
     (setq N 0)
     (repeat (sslength NaborPrimitivPoint)
      (setq PrimitivPoint (ssname NaborPrimitivPoint N))
      (setq XYmatPoint (cdr(assoc 10 (entget PrimitivPoint))))
      (setq XYmatPointOnSpline(vlax-curve-getClosestPointTo VlaPrimitivSpline XYmatPoint))
      (setq XYmatStartPointOnSpline (vlax-curve-getStartPoint VlaPrimitivSpline))
      (setq XYmatEndPointOnSpline (vlax-curve-getEndPoint VlaPrimitivSpline))
       (if (not(or(equal XYmatPointOnSpline XYmatStartPointOnSpline 0.000000001)
                  (equal XYmatPointOnSpline XYmatEndPointOnSpline 0.000000001)))
         (command "_line" XYmatPoint XYmatPointOnSpline "")
       )
       (setq N (1+ N))
     )
    01.jpg
     
    #853
  14. ivsem

    Форумчанин

    Регистрация:
    26 мар 2009
    Сообщения:
    2.475
    Симпатии:
    1.051
    Адрес:
    Киев
    Добавил разделение точек на правые и левые по ходу сплайна. Слева-синие, справа-красные.
    Код:
    (vl-load-com)
     (setq PrimitivSpline (car(entsel "\nВыберите сплайн" )))
     (setq VlaPrimitivSpline (vlax-ename->vla-object PrimitivSpline))
     (prompt "\nВыберите точки")
     (setq NaborPrimitivPoint (ssget '((0 . "POINT"))))
     (setq N 0)
     (repeat (sslength NaborPrimitivPoint)
      (setq PrimitivPoint (ssname NaborPrimitivPoint N))
      (setq XYmatPoint (cdr(assoc 10 (entget PrimitivPoint))))
      (setq XYmatPointOnSpline(vlax-curve-getClosestPointTo VlaPrimitivSpline XYmatPoint))
      (setq XYmatStartPointOnSpline (vlax-curve-getStartPoint VlaPrimitivSpline))
      (setq XYmatEndPointOnSpline (vlax-curve-getEndPoint VlaPrimitivSpline))
       (if (not(or(equal XYmatPointOnSpline XYmatStartPointOnSpline 0.000000001)
                  (equal XYmatPointOnSpline XYmatEndPointOnSpline 0.000000001)))
         (progn
           (command "_line" XYmatPoint XYmatPointOnSpline "")
           (setq AngleToPoint(angle XYmatPointOnSpline XYmatPoint))
           (setq FirstDerivSpline(vlax-curve-getFirstDeriv VlaPrimitivSpline
    (vlax-curve-getParamAtPoint VlaPrimitivSpline XYmatPointOnSpline)))
           (setq AngleSpline (Angle (list 0 0 0) FirstDerivSpline))
          (setq aaa (- AngleToPoint AngleSpline))
           (if (< aaa 0.0)(setq aaa (+ aaa (* PI 2))))
           (if (> aaa (* PI 2))(setq aaa (- aaa (* PI 2))))
           (if (and(> aaa 0.0)(< aaa PI))
     (progn
       (command "_color" 5)
       (command "_circle" XYmatPoint 6)
       (command "_change" PrimitivPoint "" "_P" "_C" 5 "")
     )
     (progn
       (command "_color" 1)
       (command "_circle" XYmatPoint 10)
       (command "_change" PrimitivPoint "" "_P" "_C" 1 "")
     )
          )
         )
       )
       (setq N (1+ N))
     )
    02.jpg
     
    #854
    SOYZNIK, Steinar и Qvinto нравится это.
  15. Steinar

    Форумчанин

    Регистрация:
    30 авг 2012
    Сообщения:
    699
    Симпатии:
    496
    Адрес:
    Асгардия
    ivsem, сейчас протестирую...
    --- Сообщения объединены, 1 июл 2019, Оригинальное время сообщения: 1 июл 2019 ---
    Сработало, но не для всех точек:
    Снимок.PNG
    Дальше я сам постараюсь разобраться. Спасибо!
     
    #855
  16. ivsem

    Форумчанин

    Регистрация:
    26 мар 2009
    Сообщения:
    2.475
    Симпатии:
    1.051
    Адрес:
    Киев
    Алгоритм лево-право, как бы первое приближение.
    Выложи dwg (для асад 2012 или более древний) с сплайном и точками, хочу проверить почему не сработало.
     
    #856
  17. Steinar

    Форумчанин

    Регистрация:
    30 авг 2012
    Сообщения:
    699
    Симпатии:
    496
    Адрес:
    Асгардия
    Файл с точками не сохранился ))) есть только со сплайном.
    Не сработало, наверное, потому что ближайшая точка для пропущенных - конец/начало сплайна.
    *мне достаточно Вашего алгоритма - я над ним поработаю.
     

    Вложения:

    #857
  18. SOYZNIK

    Форумчанин

    Регистрация:
    31 дек 2012
    Сообщения:
    251
    Симпатии:
    79
    Адрес:
    Питер
    ivsem, добрый день. Увидел кривые и вспомнил старую задачу, решения которой у меня до сих пор нет.По возможности прошу помочь. Суть просьбы(приложил двж):
    Есть синяя полилиния состоящая из прямых отрезков и дуг (ось трассы).
    Есть полилиния "хорда" А-Б фиксированной заданной длины L (в примере 300м, это расстояние прямой видимости из точки А)
    Необходимо построить множество таких "хорд"с шагом n, при этом точки А и Б должны лежать на оси трассы и эти "хорды" должны иметь заданную длину. В результате получится коридор с шагом n(в примере 5м), сформированный точками пересечения "хорд" между собой.
    Данный коридор позволяет оценить видимость на участке автомобильной дороги и выявить помехи/ назначить мероприятия по обеспечению видимости в плане.

    ***
    Спасибо заранее!!
     

    Вложения:

    #858
    Steinar нравится это.
  19. ivsem

    Форумчанин

    Регистрация:
    26 мар 2009
    Сообщения:
    2.475
    Симпатии:
    1.051
    Адрес:
    Киев
    Тестируйте. Повторный запуск программы- набрать число 11 и нажать Enter.
    Horda01.jpg
     

    Вложения:

    • Horda01.fas
      Размер файла:
      2,1 КБ
      Просмотров:
      3
    #859
    BearDyugin и SOYZNIK нравится это.
  20. SOYZNIK

    Форумчанин

    Регистрация:
    31 дек 2012
    Сообщения:
    251
    Симпатии:
    79
    Адрес:
    Питер
    Спасибо огромное!!! попробовал на полилинии более сложной конфигурации, сплайне, все отрабатывает но в определенный момент делает пропуски (во вложении) похоже что это связано с длиной хорды и небольшим расстоянием между "витками"
    ***
    с помощью команды акада "контур" можно по хордам получить искомую линию в пару кликов
     

    Вложения:

    #860

Поделиться этой страницей

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