1

(11 ответов, оставленных в LISP)

gunterZhlob пишет:

2021 год. Я пришел в эту тему, чтоб узнать как бороться с "acad_proxy_entity"

Прошло ещё 12 лет....
Чтобы узнать, для начала прочти сообщения темы.
Например №9

Я полный профан в математике. Но Поисе дал мне кучу программных решений Введите текст ссылки...

В Руководстве AutoCAD 2012
DXF Reference коды описаны так. А что они еще подразумевают, я не знаю.
Займитесь исследованием

LIGHT
The following group codes apply to light entities. In addition to the group
codes described here, see Common Group Codes for Entities on page 61. For
information about abbreviations and formatting used in this table, see
Formatting Conventions in This Reference on page 2.
Light group codes
Group code Description
100 Subclass marker (AcDbLight)
90 Version number
1 Light name
70 Light type (distant = 1; point = 2; spot = 3)
290 Status
291 Plot glyph
40 Intensity
10 Light Position
DXF: X value; APP: 3D point
20, 30 DXF: X, Y, and Z values of the light position
11 Target location

Light group codes
Group code Description
DXF: X value; APP: 3D point
21, 31 DXF: X, Y, and Z values of the target location
72 Attenuation type
0 = None
1 = Inverse Linear
2 = Inverse Square
292 Use attenuation limits
41 Attenuation start limit
42 Attenuation end limit
50 Hotspot angle
51 Falloff angle
293 Cast shadows
73 Shadow Type
0 = Ray traced shadows
1 = Shadow maps
91 Shadow map size
280 Shadow map softness

Не совсем понял вопрос...
Доступ к объектам чертежа обычно делается так:

(setq ss (ssget )  ; указываем источник света
      en (ssname ss 0)
      el (entget el))

Тогда EL выглядит так
((-1 . <Имя объекта: 18ebd48def0>) (0 . "LIGHT") (5 . "357") (102 . "{ACAD_XDICTIONARY") (360 . <Имя объекта: 18ebd48df00>) (102 . "}") (330 . <Имя объекта: 18ec5f219f0>) (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "*ADSK_SYSTEM_LIGHTS") (100 . "AcDbLight") (90 . 1) (1 . "Прожектор1") (70 . 3) (290 . 1) (63 . 7) (421 . 16777215) (291 . 0) (40 . 1.0) (10 233.793 126.824 0.0) (11 233.793 126.824 -10.0) (72 . 0) (292 . 0) (41 . 1.0) (42 . 10.0) (50 . 0.785398) (51 . 0.872665) (293 . 1) (73 . 0) (91 . 256) (280 . 1))

5

(3 ответов, оставленных в LISP)

Ответил Введите текст ссылки...

6

(3 ответов, оставленных в LISP)

webexpensive пишет:

Описал лишь то, что затребовал преподаватель..

Попробуйте разместить тему в Введите текст ссылки...
Там программеров побольше, но вряд ли кто возьмётся...
VLIDE появился впервые для 14 (не 2014) Автокада и практически не изменился к сегодняшнему дню.

webexpensive пишет:

Описал лишь то, что затребовал преподаватель...

А ваш препод знает толк в извращениях! Наверное заключил договор с Autodesk

7

(3 ответов, оставленных в LISP)

Если смотреть на чертеж, то проще всего представить участок полилинией.
Тогда при перемещении вершины, новую площадь можно получить командой

Команда: _.AREA
Укажите точку первого угла или [оБъект/Добавить площадь/Вычесть площадь] <оБъект>: Б
Выберите объекты:
Площадь = 971.6947, Периметр = 142.5807

Но загвоздка в том, что будут меняться длины сторон.
Так что трудность состоит в том ИМХО, чтобы сделать изменяемую фигуру с неизменяемыми сторонами.
Вот тут и трудность, нужны новые координаты вершин.
Попробуй построить Автокадом новую фигуру.
В примере сторона слева (16.63) красная и синяя НЕ равны друг другу.

8

(3 ответов, оставленных в LISP)

webexpensive пишет:

Редактор-генератор программ на Лиспе.

Чем не устраивает VLIDE?
Конечно хотелось бы иметь что-то получше, но в нём есть все функции, которые вы запросили в ТЗ.

9

(7 ответов, оставленных в LISP)

Пробовал применить поиск? Введите текст ссылки...

Вы решили эту задачу в другом месте?

Вы решили эту задачу в другом месте?

vadim701 пишет:

Может кому интересно будет.

Ну, это тебе интересно  biggrin

Подскажите макрос или лисп.

Тут так много последовательных действий, что боюсь макрос не спасёт.
Нужно писать Лисп

13

(1 ответов, оставленных в LISP)

Всё это (пп.1,2,3,4) проще сделать на Лиспе, а не в макросе.
Обсуждалось неоднократно и давалось куча решений.
Сходи в Поиск. Например Введите текст ссылки...

Pollcher60 пишет:

Имеется автокадовкий файл из набора полилиний. Каждая полилиния на своем уровне (цифра).

А приложить кусок файла слабо?

15

(2 ответов, оставленных в LISP)

Вот эта формула даст количество открытых документов

(vl-load-com)
(vla-get-Count (vla-get-Documents (vlax-get-acad-object)))

16

(3 ответов, оставленных в LISP)

altver пишет:

после команды Copy происходит вот это:

Приведи кусок текста Лиспа, где вызывается команда Copy с параметрами

17

(2 ответов, оставленных в DCL)

altver пишет:

активную строку
поясню:
пишу свой мэйл и есть возможность кликуть мышью на строку и сразу шлешь почту.

Задача не понятна.
При указании на любой элемент DCL  (кнопку, строку и т.д.) она становится активной
и в ЛИСП что-то возвращается. Это что-то ты можешь обрабатывать и делать какие-то телодвижения.

18

(3 ответов, оставленных в LISP)

altver пишет:

после команды Copy происходит вот это:

Не помешало бы сообщить версию Автокада (наличие сервиспака) и приложить кусок чертежа.
И почему вопрос в теме Программирование ЛИСП?

19

(55 ответов, оставленных в LISP)

Erema_Misha пишет:

А можно как-нибудь сделать, чтобы к положительным числа добавлялся + ?

Для Лиспа нет никаких проблем.
Замените 1 (одну) строку текста

Alan пишет:

            (strcat "%%u" (rtos plo 2 1))

на
         (strcat "%%u" (if (> plo 0.0) "+" "") (rtos plo 2 1))
Удачи!

20

(55 ответов, оставленных в LISP)

Вот кажется работоспособный текст для подсчета объемов картограммы.
Всех проверок на непопадание в объекты не делал. Проверял на чертеже пример_otm02 -
я там размножил пару участков или на исходном файле.
Там зачем-то angbase=270 град?
Проверяй работу!

(DEFUN c:ob (/          I           NABOR    NN     PLO      spmr
         SUMA     TEXT     OLD_DIM    OLD_DIM     old_angb nnu
         pln      nnu1     seqend    att_name att_value
        )
        ;| 
вычисляет объем срезки\насыпи по разнице отметок и площаде фигуры 
|;
  (setq    OLD_DIM     (getvar "dimzin")
;;;    angbase - в данном чертеже он повернут на 270град, делаем 0
    old_angb (getvar "angbase")
  ) ;_ конец setq
  (setvar "angbase" 0)
;;;  рабочие обнуления
  (SETQ    nnu1 T
  ) ;_ конец SETQ

  (while nnu1
    (progn
    (prompt "\nУкажите номер участка ---> или ВВОД <Выход>")
    (setq nnu1 (nz_vybor1)        ;(ssget "_:S")
    ) ;_ конец setq
    )
    (if    nnu1 
;;;      -----------------  цикл выбора участков ------------------------------------------------------
      (progn
    (setq nnu (entget (ssname nnu1 0))
    ) ;_ конец setq


;;;  ===========; считывание указанных атрибутов OTM01 в список nabor ======================
    (prompt "\nУкажите блоки отметок ---> ")
    (setq nabor (ssget
              '((0 . "INSERT")
            (2 . "OTM01")
               )
            ) ;_ конец ssget
    ) ;_ конец setq ((sslength nabor)




    (if (and nabor nnu)
      (progn
        (setq i 0
          suma 0
        ) ;_ конец setq
        (while (setq el (ssname nabor i)) ; el -   примитив

          (setq att (entnext el))
          (setq seqend (cdr (assoc 0 (entget att))))
;;;      Цикл чтение АТРИБУТОВ
;;;                    ; пока есть атрибуты в блоке
          (while (not (eq seqend "SEQEND"))
;;;                    ; имя атрибута
        (setq att_name    (cdr (assoc 2 (entget att)))
              att_value    (cdr (assoc 1 (entget att))) ; значение
              att_value    (if att_value
                  att_value
                  " "
                ) ;_ if
        ) ;_ setq
        (If (= att_name "DELTA")
          (setq spmr (cons (atof att_value) spmr))
        ) ;_ конец If
        (setq att (entnext att)
              att_value    nil
        ) ;_ setq
        (setq seqend (cdr (assoc 0 (entget att))))
          )                ; end    while (not (eq seqend "SEQEND"))
          (setq i (1+ i)
          ) ;_ конец setq
        ) ;_ while

;;; Найдем среднее в nabor

        (setq i 0)
        (repeat (sslength nabor)
          (setq suma (+ suma (nth i spmr))
            i     (1+ i)
          ) ;_ конец setq
        ) ;_ конец repeat
;;; среднее значение отметки
        (setq suma (/ suma (sslength nabor)))

        (prompt "\nВыберите полилинию участка ---> ")
        (SETQ pln (entsel)
;;;        edata (entget (car pln))
          plo (* suma
             (VLA-GET-AREA (VLAX-ENAME->VLA-OBJECT (car pln)))
              ) ;_ конец *
        ) ;_ конец SETQ



        (command "_.TEXT"
             (polar (cdr (assoc 10 nnu))
                (/ pi -2)
                (* 1.2 (cdr (assoc 40 nnu)))
             ) ;_ конец polar
             (cdr (assoc 40 nnu))
             0
             (strcat "%%u" (rtos plo 2 1))
        ) ;_ конец command
      ) ;_ конец progn
    ) ;_ конец if (and nabor nnu)
      ) ;_ конец progn




;;;      -----------------  цикл выбора участков ------------------------------------------------------

      (progn
    (prompt "\nВы закончили работу")
      ) ;_ конец progn
    ) ;_ конец if - nnu

  )                    ; - while
  (setvar "dimzin" OLD_DIM)
  (setvar "angbase" old_angb)
  (princ)
) ;_ конец DEFUN
;;; -----------------    подпрограмма выбора TEXT примитива , если Esc - возврат nil --------------------------------
(defun nz_vybor1 (/ r)
  (vl-catch-all-apply
    '(lambda ()
       (setq r (ssget '((0 . "TEXT"))))
     ) ;_ end of lambda
  ) ;_ end of vl-catch-all-apply
  (setq    r (if r
        r
        nil
      ) ;_ конец if
  ) ;_ конец setq
) ;_ конец defun
;;; вызов

21

(55 ответов, оставленных в LISP)

Erema_Misha пишет:

чтоб значения брались из блока otm01 из атрибута DELTA путем выбора блоков, и выбора фигуры получался объём.

Выбрать 4 значения DELTA из 4-х блоков, проблем нет.
Примерный алгоритм запроса:
Выберите номер участка ---> (это текст в центре квадрата?)
Выберите четыре угла участка ---> это 4 блока по углам,

и вычисляет среднее) ->Enter -> выбираешь полилинию и получаешь объём насыпи или выемки

На что умножать среднее значение чтобы получить объём, на площадь полилинии?
Не геодезист я...

22

(55 ответов, оставленных в LISP)

Erema_Misha пишет:

Если есть возможность, посмотрите, пожалуйста, вариант применения данного лиспа к атрибуту DELTA.

Какой Лисп взять для рассмотрения, из пункта 35 или 36?
Что там указывать надо?
Сделайте какой-то чертеж, чтобы я на нём производил действия программы.
Я не геодезист, я немного программирую на ЛИСПе!

23

(55 ответов, оставленных в LISP)

Alan пишет:

А можно лисп объема из этой темы применить к блокам (атрибуту DELTA)

Может быть и можно, но разбираться нет времени. Попробуй сам.
Я на месяц в отпуск отбываю.

24

(55 ответов, оставленных в LISP)

Alan пишет:

в этом блоке разница будет высчитываться автоматом и можно задать цвет текста, точку(запятую)в значении?

Больше того, тогда можно выделить все(!) блоки отметок и за 1(одну) сек. получить подписанную разницу.

Я другого и не обещал!

25

(55 ответов, оставленных в LISP)

Erema_Misha пишет:
Alan пишет:
Alan aka Александр Назаров пишет:

можно выделить все(!) блоки отметок и за 1(одну) сек. получить подписанную разницу.

Сделали с Largo_GT и тот и этот вариант. Если кому-то интересно, можно опубликовать.

Добрый день. Было бы ОЧЕНЬ интересно посмотреть на этот блок и Lisp. Можете опубликовать?

Я только помогал Largo_GT править Лисп. В моих архивах и следов то этого не осталось...
М.б. у Largo_GT осталось? Если очень надо, пишите ему. Я на месяц в отпуск отбываю.
Хотя какой-то ЛИСП-текст нашел.
(defun c:raz2 (/ ss el spmr delta att seqend a_name new_value att0 att)
          ;|
вычисляет разницу между проектными и существующими отметками
и вставляет её в блок otm01
   
|;
;;;  ===========; считывание  атрибутов в список ss  ======================
  (setq ss nil)
  (while (null ss)
    (setq ss (ssget '((0 . "INSERT") (2 . "OTM01"))
         ) ;_ конец ssget
    ) ;_ setq
  ) ;_ while
;;;  (setq el (car (entsel "\nУкажите блок: ")))
;;;      Цикл чтение АТРИБУТОВ
  (setq i 0)
  (if ss
    (progn
      (while (setq el (ssname ss i)) ; el -   примитив

    (setq att (entnext el))
    (setq seqend (cdr (assoc 0 (entget att))))
;;;                    ; пока есть атрибуты в блоке
    (while (not (eq seqend "SEQEND"))
;;;                    ; имя атрибута
      (setq    att_name  (cdr (assoc 2 (entget att)))
        att_value (cdr (assoc 1 (entget att))) ; значение
        att_value (if (= att_value "")
                "0"
                att_value
              ) ;_ if
      ) ;_ setq
      (cond
        ((= att_name "DELTA") (setq mar (list "DELTA" att_value)))
        ((= att_name "RED") (setq mar (list "RED" att_value)))
        ((= att_name "BLACK") (setq mar (list "BLACK" att_value)))
      ) ;_ cond

      (setq    spmr (cons mar spmr)
      ) ;_ конец setq
      (setq    att (entnext att)
        att_value nil
      ) ;_ setq
      (setq seqend (cdr (assoc 0 (entget att))))
    ) ;_ конец while


    (setq delta (- (atof (car (cdr (assoc "RED" spmr))))
               (atof (car (cdr (assoc "BLACK" spmr))))
            ) ;_ конец -
          delta
;;;     (vl-string-subst
;;;        ","
;;;        "."
            (strcat (if    (> delta 0)
                  "+"
                  ""
                ) ;_ конец if
                (rtos delta 2 2)
            ) ;_ конец strcat
;;;          ) ;_ конец vl-string-subst
    ) ;_ конец setq
    (nz_att_ch10 el (list (list "DELTA" delta)))
        (setq     i       (1+ i))

      ) ;_ конец while
    ) ;_ конец progn
    (prompt
      "\n Блоков маркировки отметок земли - не найдено"
    ) ;_ конец prompt
  ) ;_ конец if
  (princ)
) ;_ конец defun

                         
;;; ===================      ЗАМЕНА ЗНАЧЕНИЙ АТРИБУТОВ ========================================
(defun nz_att_ch10
       (el_sp sp_atr / att seqend a_name new_value att0 att)
;;;    el_sp - элемент списка
;;;     new_value - новое значение
  (setq att (entnext el_sp))
  (setq seqend (cdr (assoc 0 (entget att))))
  (while (not (eq seqend "SEQEND"))
                  ; пока есть атрибуты в блоке
    (setq a_name (cdr (assoc 2 (entget att)))) ; находим  атрибут

;;; начинаем проверять по списку для изменений: есть - меняем
    (setq new_value (car (cdr (assoc a_name sp_atr))))

    (if    new_value
      (setq att0 (subst    (cons 1 new_value)
            (assoc 1 (entget att))
            (entget att)
         ) ;_ конец subst
      ) ;_ конец setq
    ) ;_ конец if
    (entmod att0)
    (entupd att)
    (setq att (entnext att))
    (setq seqend (cdr (assoc 0 (entget att))))
  ) ;_ конец while
) ;_ конец defun