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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Готовые программы > Вставка блока в точку, в точку с поворотом, в центр полилинии, рядом с другим блоком

Вставка блока в точку, в точку с поворотом, в центр полилинии, рядом с другим блоком

Ответ
Поиск в этой теме
Непрочитано 25.07.2023, 04:35 #1
Вставка блока в точку, в точку с поворотом, в центр полилинии, рядом с другим блоком
Сыч
 
Регистрация: 05.04.2011
Сообщений: 45

Здравствуйте.
Первый лисп позволяет вставить выбранный блок в выбранные точки на чертеже.
Второй лисп также вставляет выбранный блок в выбранные точки при этом блок ориентируется по указанной пользователем полилинии.
Третий - вставляет блок в центр замкнутой полилинии с поворотом по одной из сторон многоугольника. Лисп создавался в первую очередь для вставки в прямоугольники.
Четвертый - вставляет блок в точку вставки другого блока, уже размещённого на чертеже.
Код:
[Выделить все]
 (vl-load-com)                                                                   ; загружаем функции расширения
(defun c:block_in_point (/ obj adoc mspace block vla_block blockname points k_points point1 centr n osm)
  
  (setq obj (vlax-get-acad-object))                                             ; указатель на программу AutoCAD
  (setq adoc (vla-get-activedocument obj))                                      ; указатель на активный документ
  (setq mspace (vla-get-modelspace adoc))                                       ; указатель на пространство модели  
  
  (setq block (car (entsel "\nВыберите блок для вставки: ")))				            ; указание блока на чертеже
  (setq vla_block (vlax-ename->vla-object block))                               ; преобразование блока в vla-объект
  (setq blockname (vla-get-EffectiveName vla_block))                            ; получение имени выбранного блока
    
  (setq n 0 k_points 0)
  
  (princ "\nВыберете на чертеже точки:")
  (setq points (ssget '((0 . "POINT"))))                                        ; выбор точек
  
  (if points                                                                    ; проверка выбора точек
    (setq k_points (sslength points))                                           ; количество выбранных точек
    (princ "Точки не выбраны")
  )      
  
  (setq osm (getvar "osmode"))                                                  ; сохранение параметров объектной привязки
  (setvar "osmode" 0)                                                           ; отключение объектной привязки
  
  (repeat k_points
    (setq point1 (ssname points n))                                             ; вычленение точки из набора
    (setq centr (cdr(assoc 10 (entget point1))))                                ; получение координат точки

    (vla-insertblock mspace (vlax-3d-point centr) blockname 1. 1. 1. 0)         ; вставка блока
    
    (setq n (1+ n))                                                             ; щёлкнул счетчик
  )

  (setvar "osmode" osm)                                                         ; включение объектной привязки

)
Код:
[Выделить все]
 (vl-load-com)                                                                                                                                ; загружаем функции расширения
(defun c:block_in_point_along_line (/ obj adoc mspace block vla_block blockname points k_points orientir point1 centr blizh ugol n osm)
  
  (setq obj (vlax-get-acad-object))                                                                                                          ; указатель на программу AutoCAD
  (setq adoc (vla-get-activedocument obj))                                                                                                   ; указатель на активный документ
  (setq mspace (vla-get-modelspace adoc))                                                                                                    ; указатель на пространство модели  
  
  (setq block (car (entsel "\nВыберите блок для вставки: ")))				                                                                         ; указание блока на чертеже
  (setq vla_block (vlax-ename->vla-object block))                                                                                            ; преобразование блока в vla-объект
  (setq blockname (vla-get-EffectiveName vla_block))                                                                                         ; получение имени выбранного блока
    
  (setq n 0 k_points 0)
  
  (princ "\nВыберете на чертеже точки:")
  (setq points (ssget '((0 . "POINT"))))                                                                                                     ; выбор точек
  
  (if points                                                                                                                                 ; проверка выбора точек
    (setq k_points (sslength points))                                                                                                        ; количество выбранных точек
    (princ "Точки не выбраны")
  )
  
  (setq orientir (vlax-ename->vla-object (car (entsel "\nВыберите на чертеже линию, относительно которой будут сориентированы блоки: "))))   ; выбор линии-ориентира
  
  (setq osm (getvar "osmode"))                                                                                                               ; сохранение параметров объектной привязки
  (setvar "osmode" 0)                                                                                                                        ; отключение объектной привязки
  
  (repeat k_points
    (setq point1 (ssname points n))                                                                                                          ; вычленение точки из набора
    (setq centr (cdr(assoc 10 (entget point1))))                                                                                             ; получение координат точки
    (setq blizh (vlax-curve-getClosestPointTo orientir centr))                                                                               ; получение ближайшей точки на линии-ориентире
    (setq ugol (angle '(0. 0. 0.) (vlax-curve-getfirstderiv orientir (vlax-curve-getparamatpoint orientir blizh))))                          ; вычисление угла поворота блока
        
    (vla-insertblock mspace (vlax-3d-point centr) blockname 1. 1. 1. ugol)                                                                   ; вставка блока
    
    (setq n (1+ n))                                                                                                                          ; щёлкнул счетчик
  )

  (setvar "osmode" osm)                                                                                                                      ; включение объектной привязки

)
Код:
[Выделить все]
 (vl-load-com)                                                                   ; загружаем функции расширения
(defun c:block_in_polyline (/ obj adoc mspace blocksvet vla_blocksvet blocksvetname polysvet k_poly polysvet1 centr n pl x1 y1 x2 y2 x3 y3 ugol1 ugol2 ugol)
  
  (setq obj (vlax-get-acad-object))                                             ; указатель на программу AutoCAD
  (setq adoc (vla-get-activedocument obj))                                      ; указатель на активный документ
  (setq mspace (vla-get-modelspace adoc))                                       ; указатель на пространство модели  
  
  (setq blocksvet (car (entsel "\nВыберите блок для вставки: ")))				        ; указание блока на чертеже
  (setq vla_blocksvet (vlax-ename->vla-object blocksvet))                       ; преобразование блока в vla-объект
  (setq blocksvetname (vla-get-EffectiveName vla_blocksvet))                    ; получение имени выбранного блока
    
  (setq n 0 k_poly 0)
  
  (princ "\nВыберете на чертеже полилинии:")
  (setq polysvet (ssget '((0 . "*POLYLINE"))))                                  ; выбор полилиний
  
  (if polysvet
    (setq k_poly (sslength polysvet))                                           ; количество выбранных полилиний
    (princ "Полилинии не выбраны")
  )      
  
  (setq osm (getvar "osmode"))                                                  ; сохранение параметров объектной привязки
  (setvar "osmode" 0)                                                           ; отключение объектной привязки
  
  (repeat k_poly
    (setq polysvet1 (ssname polysvet n))                                        ; вычленение полилинии из набора
    (foreach a (entget polysvet1)                                               ; получение списка координат вершин полилинии
  		(if (= (car a) 10)
   			(setq pl (cons (cdr a) pl))
  		)
 	  )                                 
    
    (setq centr (eea-centroid-solid-pl pl))                                     ; получение центра замкнутой полилинии
    
    (setq x1 (nth 0 (nth 0 pl)))                                                ; получение координат первого отрезка полилинии
    (setq y1 (nth 1 (nth 0 pl)))
    (setq x2 (nth 0 (nth 1 pl)))
    (setq y2 (nth 1 (nth 1 pl)))
    (setq x3 (nth 0 (nth 2 pl)))
    (setq y3 (nth 1 (nth 2 pl)))
    
    (setq ugol1 (atan (- y2 y1) (- x2 x1)))                                     ; вычисление угла между первым сегментом и осью X
    (if (> ugol1 (/ pi 2)) (setq ugol1 (- ugol1 pi)))
    (setq ugol2 (atan (- y3 y2) (- x3 x2)))                                     ; вычисление угла между вторым сегментом и осью X
    (if (> ugol2 (/ pi 2)) (setq ugol2 (- ugol2 pi)))
    
    (if (> (abs ugol1) (abs ugol2))                                             ; выбор угла поворота блока
      (setq ugol ugol2)
      (setq ugol ugol1)
    )
    (setq pl nil)                                                               ; обнуление списка координат вершин полилинии
    
    (vla-insertblock mspace (vlax-3d-point centr) blocksvetname 1. 1. 1. ugol)  ; вставка блока
    (setq n (1+ n))                                                             ; щёлкнул счетчик
  )
  
  (setvar "osmode" osm)                                                         ; включение объектной привязки
  
)
    
; by ElpanovEvgeniy
; Библиотечная функция, Центроид (центр масс) области, внутри многоугольника
; pl - список вершин полилинии (код 10)
; Дата создания 2000 - 2005 годы
; Последняя редакция 08.06.2009

(defun eea-centroid-solid-pl (pl)
(setq l 0)
 (mapcar
  (function /)
  (apply (function mapcar)
         (cons (function +)
               (mapcar (function (lambda (p1 p2 / BL I PL)
                                  (setq i (/ (- (* (car p1) (cadr p2)) (* (car p2) (cadr p1))) 2)
                                        l (+ i l)
                                        i (/ i 3)
                                  ) ;_  setq
                                  (mapcar (function (lambda (a b) (* (+ a b) i))) p1 p2)
                                 ) ;_  lambda
                       ) ;_  function
                       (cons (last pl) pl)
                       pl
               ) ;_  mapcar
         ) ;_  cons
  ) ;_  apply
  (list l l)
 ) ;_  mapcar
) ;_  defun
Код:
[Выделить все]
 (vl-load-com)                                                                   ; загружаем функции расширения
(defun c:block_in_block (/ obj adoc mspace block vla_block blockname blocks k_blocks block1 centr n osm)
  
  (setq obj (vlax-get-acad-object))                                             ; указатель на программу AutoCAD
  (setq adoc (vla-get-activedocument obj))                                      ; указатель на активный документ
  (setq mspace (vla-get-modelspace adoc))                                       ; указатель на пространство модели  
  
  (setq block (car (entsel "\nВыберите блок для вставки: ")))				            ; указание блока на чертеже
  (setq vla_block (vlax-ename->vla-object block))                               ; преобразование блока в vla-объект
  (setq blockname (vla-get-EffectiveName vla_block))                            ; получение имени выбранного блока
    
  (setq n 0 k_blocks 0)
  
  (princ "\nВыберете на чертеже блоки, рядом с которыми нужно вставить блок:")
  (setq blocks (ssget '((0 . "INSERT"))))                                       ; выбор блоков
  
  (if blocks                                                                    ; проверка выбора блоков
    (setq k_blocks (sslength blocks))                                           ; количество выбранных блоков
    (princ "Точки не выбраны")
  )      
  
  (setq osm (getvar "osmode"))                                                  ; сохранение параметров объектной привязки
  (setvar "osmode" 0)                                                           ; отключение объектной привязки
  
  (repeat k_blocks
    (setq block1 (ssname blocks n))                                             ; вычленение блока из набора
    (setq centr (cdr(assoc 10 (entget block1))))                                ; получение координат точки вставки блока
    
    (vla-insertblock mspace (vlax-3d-point centr) blockname 1. 1. 1. 0)         ; вставка блока
    
    (setq n (1+ n))                                                             ; щёлкнул счетчик
  )
  
  (setvar "osmode" osm)                                                         ; включение объектной привязки
  
)
Просмотров: 2167
 
Непрочитано 25.07.2023, 07:20
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404


В листах лиспы работать не будут. Отсутствует обработка ошибок. Нет меток начала и конца отмены. Так что есть куда расти )
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.07.2023, 08:59
#3
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,809


на (vla-insertblock...) привязки не распространяются, нет смысла запоминать текущую привязку, отключать привязку, восстанавливать её.
все лиспы можно объединить в один.
__________________
K Lisp
koMon вне форума  
 
Автор темы   Непрочитано 15.08.2023, 05:16
#4
Сыч


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


Ещё пара лиспов.
Первый проставляет размеры по выбранным точкам. Выбираются точки на чертеже, по этим точкам последовательно от точки к точке проставляются размеры. Точки могут быть выбраны заранее вручную, selsim или быстрым выбором.
Второй лисп делает простановку размеров по выбранным блокам, привязываясь к точкам вставки блоков.
Код:
[Выделить все]
 (vl-load-com)                                                                   ; загружаем функции расширения
(defun c:dim_in_point (/ obj adoc mspace points k_points otstup point1 nachalo point2 konec privazka n osm)
  
  (setq obj (vlax-get-acad-object))                                             ; указатель на программу AutoCAD
  (setq adoc (vla-get-activedocument obj))                                      ; указатель на активный документ
  (setq mspace (vla-get-modelspace adoc))                                       ; указатель на пространство модели  
  
  (setq n 0 k_points 0)
  
  (princ "\nВыберете на чертеже точки:")
  (setq points (ssget '((0 . "POINT"))))                                        ; выбор точек
  
  (if points                                                                    ; проверка выбора точек
    (setq k_points (sslength points))                                           ; количество выбранных точек
    (princ "Точки не выбраны")
  )
  
  (setq otstup (getreal "\nЗадайте величину отступа:"))                         ; получение величины отступа размера от 
  
  (setq osm (getvar "osmode"))                                                  ; сохранение параметров объектной привязки
  (setvar "osmode" 0)                                                           ; отключение объектной привязки
  
  (repeat (- k_points 1)
    (setq point1 (ssname points n))                                             ; вычленение начальной точки размера из набора
    
    (setq nachalo (cdr(assoc 10 (entget point1))))                              ; получение координат начальной точки
    
    (setq point2 (ssname points (1+ n)))                                        ; вычленение конечной точки размера из набора
    
    (setq konec (cdr(assoc 10 (entget point2))))                                ; получение координат конечной точки
    
    (setq privazka                                                              ; получение координат точки размещения величины размера
      (polar
        (polar nachalo (angle nachalo konec) (/ (distance nachalo konec) 2))    ; получение координаты середины измеряемого отрезка
        (+ (angle nachalo konec) (/ pi 2))                                      ; вычисление угла направления отступа
        otstup                                                                  ; величина отступа
      )
    )

    (vla-adddimaligned mspace                                                   ; вставка размера
      (vlax-3d-point nachalo)
      (vlax-3d-point konec)
      (vlax-3d-point privazka)
    )
    
    (setq n (1+ n))                                                             ; щёлкнул счетчик
  )

  (setvar "osmode" osm)                                                         ; включение объектной привязки

)
Код:
[Выделить все]
 (vl-load-com)                                                                   ; загружаем функции расширения
(defun c:dim_in_block (/ obj adoc mspace blocks k_blocks block1 otstup nachalo block2 konec privazka n osm)
  
  (setq obj (vlax-get-acad-object))                                             ; указатель на программу AutoCAD
  (setq adoc (vla-get-activedocument obj))                                      ; указатель на активный документ
  (setq mspace (vla-get-modelspace adoc))                                       ; указатель на пространство модели  
  
  (setq n 0 k_blocks 0)
  
  (princ "\nВыберете на чертеже блоки, по которыми нужно проставить размеры:")
  (setq blocks (ssget '((0 . "INSERT"))))                                       ; выбор блоков
  
  (if blocks                                                                    ; проверка выбора блоков
    (setq k_blocks (sslength blocks))                                           ; количество выбранных блоков
    (princ "Блоки не выбраны")
  )
  
  (setq otstup (getreal "\nЗадайте величину отступа:"))                         ; получение величины отступа размера от 
  
  (setq osm (getvar "osmode"))                                                  ; сохранение параметров объектной привязки
  (setvar "osmode" 0)                                                           ; отключение объектной привязки
  
  (repeat (- k_blocks 1)
    (setq block1 (ssname blocks n))                                             ; вычленение начальной точки размера из набора
    
    (setq nachalo (cdr(assoc 10 (entget block1))))                              ; получение координат начальной точки
    
    (setq block2 (ssname blocks (1+ n)))                                        ; вычленение конечной точки размера из набора
    
    (setq konec (cdr(assoc 10 (entget block2))))                                ; получение координат конечной точки
    
    (setq privazka                                                              ; получение координат точки размещения величины размера
      (polar
        (polar nachalo (angle nachalo konec) (/ (distance nachalo konec) 2))    ; получение координаты середины измеряемого отрезка
        (+ (angle nachalo konec) (/ pi 2))                                      ; вычисление угла направления отступа
        otstup                                                                  ; величина отступа
      )
    )

    (vla-adddimaligned mspace                                                   ; вставка размера
      (vlax-3d-point nachalo)
      (vlax-3d-point konec)
      (vlax-3d-point privazka)
    )
    
    (setq n (1+ n))                                                             ; щёлкнул счетчик
  )

  (setvar "osmode" osm)                                                         ; включение объектной привязки

)
Сыч вне форума  
 
Автор темы   Непрочитано 24.02.2025, 06:32
#5
Сыч


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


Те же лиспы с микродополнением:
Код:
[Выделить все]
 
(vl-load-com)                                                                   ; загружаем функции расширения

(defun *error* (msg)
  (princ "Ты заходи, если что...")
)

(defun c:block_in_block (/ obj adoc mspace block vla_block blockname blocks k_blocks block1 centr n osm)
  
  (setq obj (vlax-get-acad-object))                                             ; указатель на программу AutoCAD
  (setq adoc (vla-get-activedocument obj))                                      ; указатель на активный документ
  (setq mspace (vla-get-modelspace adoc))                                       ; указатель на пространство модели  
  
  (setq block (car (entsel "\nВыберите блок для вставки: ")))				            ; указание блока на чертеже
  (setq vla_block (vlax-ename->vla-object block))                               ; преобразование блока в vla-объект
  (setq blockname (vla-get-EffectiveName vla_block))                            ; получение имени выбранного блока
    
  (setq n 0 k_blocks 0)
  
  (princ "\nВыберите на чертеже блоки, рядом с которыми нужно вставить блок:")
  (setq blocks (ssget '((0 . "INSERT"))))                                       ; выбор блоков
  
  (if blocks                                                                    ; проверка выбора блоков
    (setq k_blocks (sslength blocks))                                           ; количество выбранных блоков
    (princ "Блоки не выбраны")
  )      
  
  (setq osm (getvar "osmode"))                                                  ; сохранение параметров объектной привязки
  (setvar "osmode" 0)                                                           ; отключение объектной привязки
  
  (repeat k_blocks
    (setq block1 (ssname blocks n))                                             ; вычленение блока из набора
    (setq centr (cdr(assoc 10 (entget block1))))                                ; получение координат точки вставки блока
    
    (vla-insertblock mspace (vlax-3d-point centr) blockname 1. 1. 1. 0)         ; вставка блока
    
    (setq n (1+ n))                                                             ; щёлкнул счетчик
  )
  
  (setvar "osmode" osm)                                                         ; включение объектной привязки
  
)
Код:
[Выделить все]
 
(vl-load-com)                                                                   ; загружаем функции расширения

(defun *error* (msg)
  (princ "Ты заходи, если что...")
)

(defun c:block_in_polyline (/ obj adoc mspace blocksvet vla_blocksvet blocksvetname polysvet k_poly polysvet1 centr n pl x1 y1 x2 y2 x3 y3 ugol1 ugol2 ugol)
  
  (setq obj (vlax-get-acad-object))                                             ; указатель на программу AutoCAD
  (setq adoc (vla-get-activedocument obj))                                      ; указатель на активный документ
  (setq mspace (vla-get-modelspace adoc))                                       ; указатель на пространство модели  
  
  (setq blocksvet (car (entsel "\nВыберите блок для вставки: ")))				        ; указание блока на чертеже
  (setq vla_blocksvet (vlax-ename->vla-object blocksvet))                       ; преобразование блока в vla-объект
  (setq blocksvetname (vla-get-EffectiveName vla_blocksvet))                    ; получение имени выбранного блока
    
  (setq n 0 k_poly 0)
  
  (princ "\nВыберите на чертеже полилинии:")
  (setq polysvet (ssget '((0 . "*POLYLINE"))))                                  ; выбор полилиний
  
  (if polysvet
    (setq k_poly (sslength polysvet))                                           ; количество выбранных полилиний
    (princ "Полилинии не выбраны")
  )      
  
  (setq osm (getvar "osmode"))                                                  ; сохранение параметров объектной привязки
  (setvar "osmode" 0)                                                           ; отключение объектной привязки
  
  (repeat k_poly
    (setq polysvet1 (ssname polysvet n))                                        ; вычленение полилинии из набора
    (foreach a (entget polysvet1)                                               ; получение списка координат вершин полилинии
  		(if (= (car a) 10)
   			(setq pl (cons (cdr a) pl))
  		)
 	  )                                 
    
    (setq centr (eea-centroid-solid-pl pl))                                     ; получение центра замкнутой полилинии
    
    (setq x1 (nth 0 (nth 0 pl)))                                                ; получение координат первого отрезка полилинии
    (setq y1 (nth 1 (nth 0 pl)))
    (setq x2 (nth 0 (nth 1 pl)))
    (setq y2 (nth 1 (nth 1 pl)))
    (setq x3 (nth 0 (nth 2 pl)))
    (setq y3 (nth 1 (nth 2 pl)))
    
    (setq ugol1 (atan (- y2 y1) (- x2 x1)))                                     ; вычисление угла между первым сегментом и осью X
    (if (> ugol1 (/ pi 2)) (setq ugol1 (- ugol1 pi)))
    (setq ugol2 (atan (- y3 y2) (- x3 x2)))                                     ; вычисление угла между вторым сегментом и осью X
    (if (> ugol2 (/ pi 2)) (setq ugol2 (- ugol2 pi)))
    
    (if (> (abs ugol1) (abs ugol2))                                             ; выбор угла поворота блока
      (setq ugol ugol2)
      (setq ugol ugol1)
    )
    (setq pl nil)                                                               ; обнуление списка координат вершин полилинии
    
    (vla-insertblock mspace (vlax-3d-point centr) blocksvetname 1. 1. 1. ugol)  ; вставка блока
    (setq n (1+ n))                                                             ; щёлкнул счетчик
  )
  
  (setvar "osmode" osm)                                                         ; включение объектной привязки
  
)
    
; by ElpanovEvgeniy
; Библиотечная функция, Центроид (центр масс) области, внутри многоугольника
; pl - список вершин полилинии (код 10)
; Дата создания 2000 - 2005 годы
; Последняя редакция 08.06.2009

(defun eea-centroid-solid-pl (pl)
(setq l 0)
 (mapcar
  (function /)
  (apply (function mapcar)
         (cons (function +)
               (mapcar (function (lambda (p1 p2 / BL I PL)
                                  (setq i (/ (- (* (car p1) (cadr p2)) (* (car p2) (cadr p1))) 2)
                                        l (+ i l)
                                        i (/ i 3)
                                  ) ;_  setq
                                  (mapcar (function (lambda (a b) (* (+ a b) i))) p1 p2)
                                 ) ;_  lambda
                       ) ;_  function
                       (cons (last pl) pl)
                       pl
               ) ;_  mapcar
         ) ;_  cons
  ) ;_  apply
  (list l l)
 ) ;_  mapcar
) ;_  defun
Код:
[Выделить все]
 
(vl-load-com)                                                                                                                                ; загружаем функции расширения

(defun *error* (msg)
  (princ "Ты заходи, если что...")
)

(defun c:block_in_point_along_line (/ obj adoc mspace block vla_block blockname points k_points orientir point1 centr blizh ugol n osm)
  
  (setq obj (vlax-get-acad-object))                                                                                                          ; указатель на программу AutoCAD
  (setq adoc (vla-get-activedocument obj))                                                                                                   ; указатель на активный документ
  (setq mspace (vla-get-modelspace adoc))                                                                                                    ; указатель на пространство модели  
  
  (setq block (car (entsel "\nВыберите блок для вставки: ")))				                                                                         ; указание блока на чертеже
  (setq vla_block (vlax-ename->vla-object block))                                                                                            ; преобразование блока в vla-объект
  (setq blockname (vla-get-EffectiveName vla_block))                                                                                         ; получение имени выбранного блока
    
  (setq n 0 k_points 0)
  
  (princ "\nВыберите на чертеже точки:")
  (setq points (ssget '((0 . "POINT"))))                                                                                                     ; выбор точек
  
  (if points                                                                                                                                 ; проверка выбора точек
    (setq k_points (sslength points))                                                                                                        ; количество выбранных точек
    (princ "Точки не выбраны")
  )
  
  (setq orientir (vlax-ename->vla-object (car (entsel "\nВыберите на чертеже линию, относительно которой будут сориентированы блоки: "))))   ; выбор линии-ориентира
  
  (setq osm (getvar "osmode"))                                                                                                               ; сохранение параметров объектной привязки
  (setvar "osmode" 0)                                                                                                                        ; отключение объектной привязки
  
  (repeat k_points
    (setq point1 (ssname points n))                                                                                                          ; вычленение точки из набора
    (setq centr (cdr(assoc 10 (entget point1))))                                                                                             ; получение координат точки
    (setq blizh (vlax-curve-getClosestPointTo orientir centr))                                                                               ; получение ближайшей точки на линии-ориентире
    (setq ugol (angle '(0. 0. 0.) (vlax-curve-getfirstderiv orientir (vlax-curve-getparamatpoint orientir blizh))))                          ; вычисление угла поворота блока
        
    (vla-insertblock mspace (vlax-3d-point centr) blockname 1. 1. 1. ugol)                                                                   ; вставка блока
    
    (setq n (1+ n))                                                                                                                          ; щёлкнул счетчик
  )

  (setvar "osmode" osm)                                                                                                                      ; включение объектной привязки

)
Код:
[Выделить все]
 
(vl-load-com)                                                                   ; загружаем функции расширения

(defun *error* (msg)
  (princ "Ты заходи, если что...")
)

(defun c:block_in_point (/ obj adoc mspace block vla_block blockname points k_points point1 centr n osm)
  
  (setq obj (vlax-get-acad-object))                                             ; указатель на программу AutoCAD
  (setq adoc (vla-get-activedocument obj))                                      ; указатель на активный документ
  (setq mspace (vla-get-modelspace adoc))                                       ; указатель на пространство модели  
  
  (setq block (car (entsel "\nВыберите блок для вставки: ")))				            ; указание блока на чертеже
  (setq vla_block (vlax-ename->vla-object block))                               ; преобразование блока в vla-объект
  (setq blockname (vla-get-EffectiveName vla_block))                            ; получение имени выбранного блока
    
  (setq n 0 k_points 0)
  
  (princ "\nВыберите на чертеже точки:")
  (setq points (ssget '((0 . "POINT"))))                                        ; выбор точек
  
  (if points                                                                    ; проверка выбора точек
    (setq k_points (sslength points))                                           ; количество выбранных точек
    (princ "Точки не выбраны")
  )      
  
  (setq osm (getvar "osmode"))                                                  ; сохранение параметров объектной привязки
  (setvar "osmode" 0)                                                           ; отключение объектной привязки
  
  (repeat k_points
    (setq point1 (ssname points n))                                             ; вычленение точки из набора
    (setq centr (cdr(assoc 10 (entget point1))))                                ; получение координат точки

    (vla-insertblock mspace (vlax-3d-point centr) blockname 1. 1. 1. 0)         ; вставка блока
    
    (setq n (1+ n))                                                             ; щёлкнул счетчик
  )

  (setvar "osmode" osm)                                                         ; включение объектной привязки

)
Код:
[Выделить все]
 
(vl-load-com)                                                                   ; загружаем функции расширения

(defun *error* (msg)
  (princ "Ты заходи, если что...")
)

(defun c:dim_in_block (/ obj adoc mspace blocks k_blocks block1 otstup nachalo block2 konec privazka n osm)
  
  (setq obj (vlax-get-acad-object))                                             ; указатель на программу AutoCAD
  (setq adoc (vla-get-activedocument obj))                                      ; указатель на активный документ
  (setq mspace (vla-get-modelspace adoc))                                       ; указатель на пространство модели  
  
  (setq n 0 k_blocks 0)
  
  (princ "\nВыберете на чертеже блоки, по которыми нужно проставить размеры:")
  (setq blocks (ssget '((0 . "INSERT"))))                                       ; выбор блоков
  
  (if blocks                                                                    ; проверка выбора блоков
    (setq k_blocks (sslength blocks))                                           ; количество выбранных блоков
    (princ "Блоки не выбраны")
  )
  
  (setq otstup (getreal "\nЗадайте величину отступа:"))                         ; получение величины отступа размера от 
  
  (setq osm (getvar "osmode"))                                                  ; сохранение параметров объектной привязки
  (setvar "osmode" 0)                                                           ; отключение объектной привязки
  
  (repeat (- k_blocks 1)
    (setq block1 (ssname blocks n))                                             ; вычленение начальной точки размера из набора
    
    (setq nachalo (cdr(assoc 10 (entget block1))))                              ; получение координат начальной точки
    
    (setq block2 (ssname blocks (1+ n)))                                        ; вычленение конечной точки размера из набора
    
    (setq konec (cdr(assoc 10 (entget block2))))                                ; получение координат конечной точки
    
    (setq privazka                                                              ; получение координат точки размещения величины размера
      (polar
        (polar nachalo (angle nachalo konec) (/ (distance nachalo konec) 2))    ; получение координаты середины измеряемого отрезка
        (+ (angle nachalo konec) (/ pi 2))                                      ; вычисление угла направления отступа
        otstup                                                                  ; величина отступа
      )
    )

    (vla-adddimaligned mspace                                                   ; вставка размера
      (vlax-3d-point nachalo)
      (vlax-3d-point konec)
      (vlax-3d-point privazka)
    )
    
    (setq n (1+ n))                                                             ; щёлкнул счетчик
  )

  (setvar "osmode" osm)                                                         ; включение объектной привязки

)
Код:
[Выделить все]
 
(vl-load-com)                                                                   ; загружаем функции расширения

(defun *error* (msg)
  (princ "Ты заходи, если что...")
)

(defun c:dim_in_point (/ obj adoc mspace points k_points otstup point1 nachalo point2 konec privazka n osm)
  
  (setq obj (vlax-get-acad-object))                                             ; указатель на программу AutoCAD
  (setq adoc (vla-get-activedocument obj))                                      ; указатель на активный документ
  (setq mspace (vla-get-modelspace adoc))                                       ; указатель на пространство модели  
  
  (setq n 0 k_points 0)
  
  (princ "\nВыберете на чертеже точки:")
  (setq points (ssget '((0 . "POINT"))))                                        ; выбор точек
  
  (if points                                                                    ; проверка выбора точек
    (setq k_points (sslength points))                                           ; количество выбранных точек
    (princ "Точки не выбраны")
  )
  
  (setq otstup (getreal "\nЗадайте величину отступа:"))                         ; получение величины отступа размера от 
  
  (setq osm (getvar "osmode"))                                                  ; сохранение параметров объектной привязки
  (setvar "osmode" 0)                                                           ; отключение объектной привязки
  
  (repeat (- k_points 1)
    (setq point1 (ssname points n))                                             ; вычленение начальной точки размера из набора
    
    (setq nachalo (cdr(assoc 10 (entget point1))))                              ; получение координат начальной точки
    
    (setq point2 (ssname points (1+ n)))                                        ; вычленение конечной точки размера из набора
    
    (setq konec (cdr(assoc 10 (entget point2))))                                ; получение координат конечной точки
    
    (setq privazka                                                              ; получение координат точки размещения величины размера
      (polar
        (polar nachalo (angle nachalo konec) (/ (distance nachalo konec) 2))    ; получение координаты середины измеряемого отрезка
        (+ (angle nachalo konec) (/ pi 2))                                      ; вычисление угла направления отступа
        otstup                                                                  ; величина отступа
      )
    )

    (vla-adddimaligned mspace                                                   ; вставка размера
      (vlax-3d-point nachalo)
      (vlax-3d-point konec)
      (vlax-3d-point privazka)
    )
    
    (setq n (1+ n))                                                             ; щёлкнул счетчик
  )

  (setvar "osmode" osm)                                                         ; включение объектной привязки

)
Сыч вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Готовые программы > Вставка блока в точку, в точку с поворотом, в центр полилинии, рядом с другим блоком



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вставка значения атрибута блока в поле в блоке Prying AutoCAD 28 08.09.2020 17:51
Подмена одного блока другим fasadel AutoCAD 1 07.03.2014 15:29
Пытаюсь создать стиль мультивыноски с собственным блоком - не видит блока ГОСТ&ОПОКА AutoCAD 3 13.08.2013 15:19
Вставка блока с размером линии nolte Программирование 3 19.05.2013 11:47
Вставка динамического блока из библиотеки с потерей аннотативности Jonas Динамические блоки 20 04.12.2011 19:45