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

Поверхность по нарисованным поперечникам

Тема в разделе "Civil 3D", создана пользователем sokkol, 7 дек 2022.

  1. sokkol

    sokkol Форумчанин

    Бывает необходимость создать поверхность, нарисовав её в видах сечения, но к сожалению, в Сивиле нет штатных инструментов для этого. На помощь приходят различные утилиты. Представленный лисп код, преобразует нарисованную в виде сечения полилинию в точки, из которых можно создать желаемую поверхность.
    Естественно в чертеже должны быть виды сечения с нарисованными полилиниями:
    05-Draw Poly.png

    Итак, командой vlisp вызываем окно интерпретатора и вставляем код программы :
    01-Vlisp.png

    02-Console.png

    Загружаем код в текущее окно(чертеж) Civil3D:
    03-Load.png

    Запускается код командой digitize, набранной в командной строке:
    04-Command.png

    Выбираем вид сечения:
    06-Select View.png

    Выбираем полилинию;
    07-Select Poly.png

    Пробелом или Enter-ом повторяем команду для следующих видов сечений.
    В итоге в чертеже появляются автокадовские точки:
    08-Points.png

    Используя которые создаём нужную нам поверхность:
    09-Create Surface from Points.png
    В итоге:
    10-Surface.png

    10-Surface2.png

    Код:
    ;this code is copyright (c) 2019, Timothy Corey, Redding, CA
    ;Permission is hereby granted for you to use and modify this code in any way you see fit, within your organization.
    ;You may not distribute this code outside your organization.
     
    ;This routine requires a 2d polyline drawn atop a Section View.
    ;The output objects are AutoCAD Points, not Civil 3D COGO Points. You can convert from AutoCAD Points to COGO Points using
    ; _AeccCreatePtConvertAdeskPts command. Use PDMODE setting to control the marker style of the AutoCAD Points.
     
     
    (defun c:digitize ( / secvw plin smplin smplgr algn coords len ctr x y sta off pxyz px py pz )
    (setq cosmode (getvar "OSMODE"))
    (setvar "OSMODE" 0)
    (vl-load-com)
    ;get section view
    (setq secvw (vlax-ename->vla-object
    (car (entsel "\nSelect Section View: "))
          )
      ) ;ask user to select sec view
      (while (not
       (= (vlax-get secvw 'ObjectName) "AeccDbGraphCrossSection")
     ) ;be sure user didn't pick the wrong obtype
        (setq secvw
       (vlax-ename->vla-object
         (car
           (entsel "\nYou must select a Section View, try again: ")
         )
       )
        )
      );end get section view
     
      (setq plin (vlax-ename->vla-object (car (entsel "\nSelect polyline in section view: "))))
      (while (not (= (vlax-get plin 'ObjectName) "AcDbPolyline"))
             (setq plin (vlax-ename->vla-object (car (entsel "\nObject must be a polyline. Try again: "))))
     )
     
     (setq smplin (vlax-get secvw 'Parent))
     (setq smplgr (vlax-get smplin 'Parent))
     (setq algn (vlax-get smplgr 'Parent))
     (setq coords (vlax-get plin 'Coordinates))
     (setq len (length coords)
       ctr 0)
         
     (while (< ctr len)
     
     (setq x (nth ctr coords)
       y (nth (+ ctr 1) coords)
       sta 0.000
       off 0.000
       pz 0.000
       )
       
    (vlax-invoke-method secvw 'FindStationOffsetAndElevationAtXY x y 'sta 'off 'pz)
            (vlax-invoke-method algn 'PointLocation sta off 'px 'py)
    (setq pxyz (list px py pz))
    (vl-cmdf "Point" pxyz)
    (setq ctr (+ ctr 2))
    )
    (setvar "OSMODE" cosmode)
    (princ)
    );end defun
     
    Grandpa, geo_rva, house_cat и 5 другим нравится это.
  2. nextnicetry

    nextnicetry Форумчанин

    Так, в закладочки ::biggrin24.gif::
     
    (XY)ёжик нравится это.
  3. (XY)ёжик

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

    Что то немного не работает
     
  4. CHESNOK

    CHESNOK Форумчанин

    А в сечениях у вас корыто откуда берется?
     
  5. sokkol

    sokkol Форумчанин

    Просто нарисовал полилинией.
    --- Сообщения объединены, 8 дек 2022, Оригинальное время сообщения: 8 дек 2022 ---
    В чертеже должна быть трасса и по ней должны быть сделаны виды сечений. В этих видах рисуете полилинией нужную вам землю, в моем случае-корыто (первый скрин)
     
    CHESNOK нравится это.
  6. FOXXX591

    FOXXX591 Форумчанин

    Не появляются.::sad24.gif::
    изображение_2022-12-08_085357541.png
     
  7. sokkol

    sokkol Форумчанин

    странно, а если в вашей среде Civil3D просто выполнить команду point, что произойдёт? У меня английская версия Civil3D и команда point создаёт автокадовские точки. В тексте кода можно поменять "Point" на соответствующую команду "Точка" из русской версии, или на "_Point".

    Версия с "_Point":

    Код:
    (defun c:digitize ( / secvw plin smplin smplgr algn coords len ctr x y sta off pxyz px py pz )
    (setq cosmode (getvar "OSMODE"))
    (setvar "OSMODE" 0)
    (vl-load-com)
    ;get section view
    (setq secvw (vlax-ename->vla-object
    (car (entsel "\nSelect Section View: "))
          )
      ) ;ask user to select sec view
      (while (not
       (= (vlax-get secvw 'ObjectName) "AeccDbGraphCrossSection")
     ) ;be sure user didn't pick the wrong obtype
        (setq secvw
       (vlax-ename->vla-object
         (car
           (entsel "\nYou must select a Section View, try again: ")
         )
       )
        )
      );end get section view
     
      (setq plin (vlax-ename->vla-object (car (entsel "\nSelect polyline in section view: "))))
      (while (not (= (vlax-get plin 'ObjectName) "AcDbPolyline"))
             (setq plin (vlax-ename->vla-object (car (entsel "\nObject must be a polyline. Try again: "))))
     )
     
     (setq smplin (vlax-get secvw 'Parent))
     (setq smplgr (vlax-get smplin 'Parent))
     (setq algn (vlax-get smplgr 'Parent))
     (setq coords (vlax-get plin 'Coordinates))
     (setq len (length coords)
       ctr 0)
       
     (while (< ctr len)
     
     (setq x (nth ctr coords)
       y (nth (+ ctr 1) coords)
       sta 0.000
       off 0.000
       pz 0.000
       )
     
    (vlax-invoke-method secvw 'FindStationOffsetAndElevationAtXY x y 'sta 'off 'pz)
            (vlax-invoke-method algn 'PointLocation sta off 'px 'py)
    (setq pxyz (list px py pz))
    (vl-cmdf "_Point" pxyz)
    (setq ctr (+ ctr 2))
    )
    (setvar "OSMODE" cosmode)
    (princ)
    );end defun
     
    Последнее редактирование: 8 дек 2022
  8. FOXXX591

    FOXXX591 Форумчанин

    Нет такой команды пишет. Похоже надо делать восстановление Civila.
     
    sokkol нравится это.
  9. sokkol

    sokkol Форумчанин

    Посмотрел в интернете:

    "Просто захотелось дать полный ответ на такой вопрос: "Как в русском / немецком / китайском etc AutoCAD написать лисп / DIESEL / макрос, не зависящий от локализации?
    Все достаточно просто (на первый взгляд): ставим подчеркивание перед английским именем команды и перед каждой опцией - и все."


    В тексте кода можно/нужно поменять "Point" на "_Point" и сохранить файл для дальнейшего использования.
    Прикреплён лисп файл с изменённой командой ("Point" -> "_Point") - digitize.lsp - просто перетаскиваем файл в окно чертежа.

    Не знаю как отредактировать заглавную тему, чтобы изменить текст кода (пожаловался админам с просьбой заменить "Point" на "_Point"- может исправят)
     

    Вложения:

    • digitize.lsp
      Размер файла:
      2 КБ
      Просмотров:
      29
    Последнее редактирование: 8 дек 2022
    TulGeo, Grandpa и FOXXX591 нравится это.
  10. FOXXX591

    FOXXX591 Форумчанин

    Вот сейчас заработала.
     
    (XY)ёжик и sokkol нравится это.
  11. (XY)ёжик

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

    Заработало! Спасибо
     
  12. (XY)ёжик

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

    Но слетают привязки)
     
  13. (XY)ёжик

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

    Не стал создавать новую тему. Вот лисп с такой же логикой работы, но работает по обычным примитивам. Выбираете трассу(полилиния), задаёте масштаб вашего поперечника(вертикальный и горизонтальный, если план трассы 1:1000, поперечник больше в 5 раз, то вводим допустим мастштаб 200). Выбираете линию поверхности на сечении(полилиния), ось сечения(отрезок или полилиния), пикет(в формате ПК0+00.00) и отметка в виде текста или МТЕКСТА. Лисп строит точки на трассе с учётом масштабов, и на их основе создаёт 3д полилинию. Кому то пригодится для быстрой оцифровки проекта. Пока не получается заставить запоминать образцы примитивов, чтобы разом выбирать каждый поперечник. Коллеги может кто подскажет, как это реализовать.
     

    Вложения:

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