Re: LISP. Подсчет длины линий на определенном слое
Не поверите не могу найти применение данного лиспа, а что изолировние слоя и подсчет длинны изоляционных объектов отменили?
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → Готовые программы → LISP. Подсчет длины линий на определенном слое
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Не поверите не могу найти применение данного лиспа, а что изолировние слоя и подсчет длинны изоляционных объектов отменили?
> AIF
Выдает ввиде таблицы в Excel
> Dextron3
А если подсчитать нужно на нескольких слоях (например длинны различных кабелей)?
;|================== XLS ======================================== * Опубликовано https://www.caduser.ru/forum/topic19920.html https://www.caduser.ru/forum/topic31444.html https://www.caduser.ru/forum/topic31669.html * Автор: Владимир Азарко aka VVA * Назначение: Печать списка данных Data-list в Excell * Для вывода создается новый лист * Аргументы: Data-list — список списков данных (LIST) вида ((Value1 Value2 ... VlalueN)(Value1 Value2 ... VlalueN)...) Каждый список вида (Value1 Value2 ... VlalueN) записывается в отдельную строку в соответствующие столбцы (Value1-A Value2-B и .т.д.) header — список (LIST) заголовков или nil вида ("Подпись A" "Подпись B" ...) Если header nil, принимается ("X" "Y" "Z") Colhide — список буквенных названий стоблцов для скрытия или nil — не скрывать ("A" "C" "D") — скрыть столбцы A, C, D Name_list — имя нового листа активной книги или nil — новая книга * Возврат: nil * TIPS!!! : При передачи функции xls числовых вещественных данных нет необходимости проверять текущий системный разделитель целой и дробной части ("HKEY_CURRENT_USER\\Control Panel\\International" "sDecimal") Функцией на время вывода отключается использование в Excele системного разделителя, разделителем целой и дробной части устанавливается точка. После завершения ф-ции все восстанавливается. Пример вызова (xls '((1.1 1.2 1.3 1.4)(2.1 2.2 2.3 2.4)(3.1 3.2 3.3 3.4)) '("Столбец1" "Столбец2" "Столбец3" "Столбец4") '("B"))|; (vl-load-com) (defun xls ( Data-list header Colhide Name_list / *aplexcel* *books-colection* Currsep *excell-cells* *new-book* *sheet#1* *sheet-collection* col iz_listo row cell cols) (defun Letter (N / Res TMP)(setq Res "")(while (> N 0)(setq TMP (rem N 26) TMP (if (zerop TMP)(setq N (1- N) TMP 26) TMP) Res (strcat (chr (+ 64 TMP)) Res) N (/ N 26))) Res) (if (null Name_list)(setq Name_list "")) (setq *AplExcel* (vlax-get-or-create-object "Excel.Application")) (if (setq *New-Book* (vlax-get-property *AplExcel* "ActiveWorkbook")) (setq *Books-Colection* (vlax-get-property *AplExcel* "Workbooks") *Sheet-Collection* (vlax-get-property *New-Book* "Sheets") *Sheet#1* (vlax-invoke-method *Sheet-Collection* "Add")) (setq *Books-Colection* (vlax-get-property *AplExcel* "Workbooks") *New-Book* (vlax-invoke-method *Books-Colection* "Add") *Sheet-Collection* (vlax-get-property *New-Book* "Sheets") *Sheet#1* (vlax-get-property *Sheet-Collection* "Item" 1))) (setq *excell-cells* (vlax-get-property *Sheet#1* "Cells")) (setq Name_list (if (= Name_list "") (vl-filename-base(getvar "DWGNAME")) (strcat (vl-filename-base(getvar "DWGNAME")) "&" Name_list)) col 0 cols nil) (if (> (strlen Name_list) 26) (setq Name_list (strcat (substr Name_list 1 10) "..." (substr Name_list (- (strlen Name_list) 13) 14)))) (vlax-for sh *Sheet-Collection* (setq cols (cons (strcase(vlax-get-property sh 'Name)) cols))) (setq row Name_list) (while (member (strcase row) cols)(setq row (strcat Name_list " (" (itoa(setq col (1+ col)))")"))) (setq Name_list row) (vlax-put-property *Sheet#1* 'Name Name_list) (setq Currsep (vlax-get-property *AplExcel* "UseSystemSeparators")) (vlax-put-property *AplExcel* "UseSystemSeparators" :vlax-false) ;_не использовать системные установки (vlax-put-property *AplExcel* "DecimalSeparator" ".") ;_разделитель дробной и целой части (vlax-put-property *AplExcel* "ThousandsSeparator" " ") ;_разделитель тысячей (vla-put-visible *AplExcel* :vlax-true)(setq row 1 col 1) (if (null header)(setq header '("X" "Y" "Z"))) (repeat (length header)(vlax-put-property *excell-cells* "Item" row col (vl-princ-to-string (nth (1- col) header)))(setq col (1+ col)))(setq row 2 col 1) (repeat (length Data-list)(setq iz_listo (car Data-list))(repeat (length iz_listo) (vlax-put-property *excell-cells* "Item" row col (vl-princ-to-string (car iz_listo))) (setq iz_listo (cdr iz_listo) col (1+ col)))(setq Data-list (cdr Data-list))(setq col 1 row (1+ row))) (setq col (1+(length header)) row (1+ row)) (setq cell (vlax-variant-value (vlax-invoke-method *Sheet#1* "Evaluate" (strcat "A1:" (letter col)(itoa row))))) ;_ end of setq (setq cols (vlax-get-property cell 'Columns)) (vlax-invoke-method cols 'Autofit) (vlax-release-object cols)(vlax-release-object cell) (foreach item ColHide (if (numberp item)(setq item (letter item))) (setq cell (vlax-variant-value (vlax-invoke-method *Sheet#1* "Evaluate" (strcat item "1:" item "1")))) (setq cols (vlax-get-property cell 'Columns)) (vlax-put-property cols 'hidden 1) (vlax-release-object cols)(vlax-release-object cell)) (vlax-put-property *AplExcel* "UseSystemSeparators" Currsep) (mapcar 'vlax-release-object (list *excell-cells* *Sheet#1* *Sheet-Collection* *New-Book* *Books-Colection* *AplExcel*))(setq *AplExcel* nil)(gc)(gc)(princ)) ;_Команда MLEN41 (defun c:mlen41 (/ m ss clist temp) (defun sort (lst predicate) (mapcar '(lambda (x) (nth x lst)) (vl-sort-i lst predicate)) ) (defun combine (inlist is-greater is-equal / sorted current result) (setq sorted (sort inlist is-greater)) (setq current (list (car sorted))) (foreach item (cdr sorted) (if (apply is-equal (list item (car current))) (setq current (cons item current)) (progn (setq result (cons current result)) (setq current (list item)) ) ) ) (cons current result) ) (defun mlen4_1 (lst / sum_len) (setq sum_len 0) (foreach item (mapcar 'car lst) (setq sum_len (+ sum_len (if (vlax-property-available-p item 'length) (vla-get-length item) (cond ((= (strcase (vla-get-objectname item) t) "acdbarc" ) ;_ = (vla-get-arclength item) ) ((= (strcase (vla-get-objectname item) t) "acbcircle" ) ;_ = (* pi 2.0 (vla-get-radius item)) ) (t 0.0) ) ;_ cond ) ;_ if ) ;_ + ) ) (if (not (zerop sum_len)) (princ (strcat "\n\t" (cdar lst) " = " (rtos (* sum_len m) 2 4)) ) ) (list (cdar lst)(rtos (* sum_len m) 2 4)) ) (vl-load-com) (and (setq m (getreal "\nвведите маштабный коэффициент:\t")) (setq ss (ssget "_:L")) (setq ss (mapcar (function vlax-ename->vla-object) (vl-remove-if (function listp) (mapcar (function cadr) (ssnamex ss) ) ;_ mapcar ) ;_ vl-remove-if ) ) (mapcar '(lambda (x) (setq temp (cons (cons x (vla-get-Layer x)) temp)) ) ss ) (setq clist (combine temp '(lambda (a b) (> (cdr a) (cdr b)) ) '(lambda (a b) (eq (cdr a) (cdr b)) ) ) ) (princ "\n\n Общая длинна всех линейных примитивов по слоям:" ) (setq temp (mapcar 'mlen4_1 clist)) (xls temp '("Слой" "Длина") nil "mlen41") ) (princ) ) ;_ defun
Команда MLEN41
> VVA
а куда пишется результат работы лиспа ?
(очень хочу разобратся)
а тот вариант что создает ехель фаил ваще не работает :((
> Tayfun
В Excell
а тот вариант что создает ехель фаил ваще не работает :((
только что проверил, все работает.
Пиши на почту что и как ты делаешь по шагам
> VVA
Владимир Плиз напиши пошагово что делать от загрузки до получения денных в екселе(на почту).
а линии должныбыть поли-линиями ?
просто линии тоже считает ?
> Tayfun
Как то не понятно, это вам нужно или VVA...
Если в строчке
(setq temp (cons (cons x (vla-get-Layer x)) temp))
Layer заменить на Linetype получим программу для подсчета длин линий разного типа (И слово Слой на Тип линии заменить). Удобно если ваши кабели сделаны каждый своим типом линии.
Пожелание:сделать значение масштабного коэффициента по умолчанию равным единице, и чтобы масштабный коэффициент запоминался и использовался при следующем вызове программы по умолчанию.
> off
C запоминанием масштаба
;|================== XLS ======================================== * Опубликовано https://www.caduser.ru/forum/topic19920.html https://www.caduser.ru/forum/topic31444.html https://www.caduser.ru/forum/topic31669.html * Автор: Владимир Азарко aka VVA * Назначение: Печать списка данных Data-list в Excell * Для вывода создается новый лист * Аргументы: Data-list — список списков данных (LIST) вида ((Value1 Value2 ... VlalueN)(Value1 Value2 ... VlalueN)...) Каждый список вида (Value1 Value2 ... VlalueN) записывается в отдельную строку в соответствующие столбцы (Value1-A Value2-B и .т.д.) header — список (LIST) заголовков или nil вида ("Подпись A" "Подпись B" ...) Если header nil, принимается ("X" "Y" "Z") Colhide — список буквенных названий стоблцов для скрытия или nil — не скрывать ("A" "C" "D") — скрыть столбцы A, C, D Name_list — имя нового листа активной книги или nil — новая книга * Возврат: nil * TIPS!!! : При передачи функции xls числовых вещественных данных нет необходимости проверять текущий системный разделитель целой и дробной части ("HKEY_CURRENT_USER\\Control Panel\\International" "sDecimal") Функцией на время вывода отключается использование в Excele системного разделителя, разделителем целой и дробной части устанавливается точка. После завершения ф-ции все восстанавливается. Пример вызова (xls '((1.1 1.2 1.3 1.4)(2.1 2.2 2.3 2.4)(3.1 3.2 3.3 3.4)) '("Столбец1" "Столбец2" "Столбец3" "Столбец4") '("B"))|; (vl-load-com) (defun xls ( Data-list header Colhide Name_list / *aplexcel* *books-colection* Currsep *excell-cells* *new-book* *sheet#1* *sheet-collection* col iz_listo row cell cols) (defun Letter (N / Res TMP)(setq Res "")(while (> N 0)(setq TMP (rem N 26) TMP (if (zerop TMP)(setq N (1- N) TMP 26) TMP) Res (strcat (chr (+ 64 TMP)) Res) N (/ N 26))) Res) (if (null Name_list)(setq Name_list "")) (setq *AplExcel* (vlax-get-or-create-object "Excel.Application")) (if (setq *New-Book* (vlax-get-property *AplExcel* "ActiveWorkbook")) (setq *Books-Colection* (vlax-get-property *AplExcel* "Workbooks") *Sheet-Collection* (vlax-get-property *New-Book* "Sheets") *Sheet#1* (vlax-invoke-method *Sheet-Collection* "Add")) (setq *Books-Colection* (vlax-get-property *AplExcel* "Workbooks") *New-Book* (vlax-invoke-method *Books-Colection* "Add") *Sheet-Collection* (vlax-get-property *New-Book* "Sheets") *Sheet#1* (vlax-get-property *Sheet-Collection* "Item" 1))) (setq *excell-cells* (vlax-get-property *Sheet#1* "Cells")) (setq Name_list (if (= Name_list "") (vl-filename-base(getvar "DWGNAME")) (strcat (vl-filename-base(getvar "DWGNAME")) "&" Name_list)) col 0 cols nil) (if (> (strlen Name_list) 26) (setq Name_list (strcat (substr Name_list 1 10) "..." (substr Name_list (- (strlen Name_list) 13) 14)))) (vlax-for sh *Sheet-Collection* (setq cols (cons (strcase(vlax-get-property sh 'Name)) cols))) (setq row Name_list) (while (member (strcase row) cols)(setq row (strcat Name_list " (" (itoa(setq col (1+ col)))")"))) (setq Name_list row) (vlax-put-property *Sheet#1* 'Name Name_list) (setq Currsep (vlax-get-property *AplExcel* "UseSystemSeparators")) (vlax-put-property *AplExcel* "UseSystemSeparators" :vlax-false) ;_не использовать системные установки (vlax-put-property *AplExcel* "DecimalSeparator" ".") ;_разделитель дробной и целой части (vlax-put-property *AplExcel* "ThousandsSeparator" " ") ;_разделитель тысячей (vla-put-visible *AplExcel* :vlax-true)(setq row 1 col 1) (if (null header)(setq header '("X" "Y" "Z"))) (repeat (length header)(vlax-put-property *excell-cells* "Item" row col (vl-princ-to-string (nth (1- col) header)))(setq col (1+ col)))(setq row 2 col 1) (repeat (length Data-list)(setq iz_listo (car Data-list))(repeat (length iz_listo) (vlax-put-property *excell-cells* "Item" row col (vl-princ-to-string (car iz_listo))) (setq iz_listo (cdr iz_listo) col (1+ col)))(setq Data-list (cdr Data-list))(setq col 1 row (1+ row))) (setq col (1+(length header)) row (1+ row)) (setq cell (vlax-variant-value (vlax-invoke-method *Sheet#1* "Evaluate" (strcat "A1:" (letter col)(itoa row))))) ;_ end of setq (setq cols (vlax-get-property cell 'Columns)) (vlax-invoke-method cols 'Autofit) (vlax-release-object cols)(vlax-release-object cell) (foreach item ColHide (if (numberp item)(setq item (letter item))) (setq cell (vlax-variant-value (vlax-invoke-method *Sheet#1* "Evaluate" (strcat item "1:" item "1")))) (setq cols (vlax-get-property cell 'Columns)) (vlax-put-property cols 'hidden 1) (vlax-release-object cols)(vlax-release-object cell)) (vlax-put-property *AplExcel* "UseSystemSeparators" Currsep) (mapcar 'vlax-release-object (list *excell-cells* *Sheet#1* *Sheet-Collection* *New-Book* *Books-Colection* *AplExcel*))(setq *AplExcel* nil)(gc)(gc)(princ)) ;_Команда MLEN41 (defun c:mlen41 (/ m ss clist temp) (defun sort (lst predicate) (mapcar '(lambda (x) (nth x lst)) (vl-sort-i lst predicate)) ) (defun combine (inlist is-greater is-equal / sorted current result) (setq sorted (sort inlist is-greater)) (setq current (list (car sorted))) (foreach item (cdr sorted) (if (apply is-equal (list item (car current))) (setq current (cons item current)) (progn (setq result (cons current result)) (setq current (list item)) ) ) ) (cons current result) ) (defun mlen4_1 (lst / sum_len) (setq sum_len 0) (foreach item (mapcar 'car lst) (setq sum_len (+ sum_len (if (vlax-property-available-p item 'length) (vla-get-length item) (cond ((= (strcase (vla-get-objectname item) t) "acdbarc" ) ;_ = (vla-get-arclength item) ) ((= (strcase (vla-get-objectname item) t) "acbcircle" ) ;_ = (* pi 2.0 (vla-get-radius item)) ) (t 0.0) ) ;_ cond ) ;_ if ) ;_ + ) ) (if (not (zerop sum_len)) (princ (strcat "\n\t" (cdar lst) " = " (rtos (* sum_len m) 2 4)) ) ) (list (cdar lst)(rtos (* sum_len m) 2 4)) ) (vl-load-com) (if (null *M*)(setq *M* 1)) (initget 6) (and (princ "\nВведите маштабный коэффициент <") (princ *M*)(princ ">: ") (or (setq m (getreal)) (setq m *M*) ) (setq *M* m) (setq ss (ssget "_:L")) (setq ss (mapcar (function vlax-ename->vla-object) (vl-remove-if (function listp) (mapcar (function cadr) (ssnamex ss) ) ;_ mapcar ) ;_ vl-remove-if ) ) (mapcar '(lambda (x) (setq temp (cons (cons x (vla-get-Layer x)) temp)) ) ss ) (setq clist (combine temp '(lambda (a b) (> (cdr a) (cdr b)) ) '(lambda (a b) (eq (cdr a) (cdr b)) ) ) ) (princ "\n\n Общая длинна всех линейных примитивов по слоям:" ) (setq temp (mapcar 'mlen4_1 clist)) (xls temp '("Слой" "Длина") nil "mlen41") ) (princ) ) ;_ defun
Ссылка по теме:
http://dwg.ru/dnl/2733
помогите пожалуйста!!очень надо..
написать программу создающую слой Size и переносящую все окружности на слой Size.создать слой Size, создать набор окружностей чертежа, заменить в каждом примитиве набора слой на новый.
За черчение Line, я бы руки отрывал.
От этих Line сплошные проблемы!!!!!!
> Innkin
Для таких просьб есть раздел LISP
Для подсчета площади по слоям на основе #59 Команда MAREA41
;_Команда MAREA41 (defun c:MAREA41 (/ m ss clist temp) ;https://www.caduser.ru/forum/topic20298.html ; Владимир Азарко aka VVA для caduser.ru (defun sort (lst predicate) (mapcar '(lambda (x) (nth x lst)) (vl-sort-i lst predicate)) ) (defun combine (inlist is-greater is-equal / sorted current result) (setq sorted (sort inlist is-greater)) (setq current (list (car sorted))) (foreach item (cdr sorted) (if (apply is-equal (list item (car current))) (setq current (cons item current)) (progn (setq result (cons current result)) (setq current (list item)) ) ) ) (cons current result) ) (defun mlen4_1 (lst / sum_area) (setq sum_area 0) (foreach item (mapcar 'car lst) (setq sum_area (+ sum_area (if (vlax-property-available-p item 'area) (vla-get-area item) 0 ) ;_ if ) ;_ + ) ) (if (not (zerop sum_area)) (princ (strcat "\n\t" (cdar lst) " = " (rtos (* sum_area m) 2 4)) ) ) (list (cdar lst)(rtos (* sum_area m) 2 4)) ) (vl-load-com) (if (null *M*)(setq *M* 1)) (initget 6) (and (princ "\nВведите маштабный коэффициент <") (princ *M*)(princ ">: ") (or (setq m (getreal)) (setq m *M*) ) (setq *M* m) (setq ss (ssget "_:L")) (setq ss (mapcar (function vlax-ename->vla-object) (vl-remove-if (function listp) (mapcar (function cadr) (ssnamex ss) ) ;_ mapcar ) ;_ vl-remove-if ) ) (mapcar '(lambda (x) (setq temp (cons (cons x (vla-get-Layer x)) temp)) ) ss ) (setq clist (combine temp '(lambda (a b) (> (cdr a) (cdr b)) ) '(lambda (a b) (eq (cdr a) (cdr b)) ) ) ) (princ "\n\n Общая площадь всех линейных примитивов по слоям:" ) (setq temp (mapcar 'mlen4_1 clist)) (xls temp '("Слой" "Площадь") nil "mlen41") ) (princ) ) ;_ defun ;|================== XLS ======================================== * Опубликовано https://www.caduser.ru/forum/topic19920.html https://www.caduser.ru/forum/topic31444.html https://www.caduser.ru/forum/topic31669.html * Автор: Владимир Азарко aka VVA * Назначение: Печать списка данных Data-list в Excell * Для вывода создается новый лист * Аргументы: Data-list — список списков данных (LIST) вида ((Value1 Value2 ... VlalueN)(Value1 Value2 ... VlalueN)...) Каждый список вида (Value1 Value2 ... VlalueN) записывается в отдельную строку в соответствующие столбцы (Value1-A Value2-B и .т.д.) header — список (LIST) заголовков или nil вида ("Подпись A" "Подпись B" ...) Если header nil, принимается ("X" "Y" "Z") Colhide — список буквенных названий стоблцов для скрытия или nil — не скрывать ("A" "C" "D") — скрыть столбцы A, C, D Name_list — имя нового листа активной книги или nil — новая книга * Возврат: nil * TIPS!!! : При передачи функции xls числовых вещественных данных нет необходимости проверять текущий системный разделитель целой и дробной части ("HKEY_CURRENT_USER\\Control Panel\\International" "sDecimal") Функцией на время вывода отключается использование в Excele системного разделителя, разделителем целой и дробной части устанавливается точка. После завершения ф-ции все восстанавливается. Пример вызова (xls '((1.1 1.2 1.3 1.4)(2.1 2.2 2.3 2.4)(3.1 3.2 3.3 3.4)) '("Столбец1" "Столбец2" "Столбец3" "Столбец4") '("B"))|; (vl-load-com) (defun xls ( Data-list header Colhide Name_list / *aplexcel* *books-colection* Currsep *excell-cells* *new-book* *sheet#1* *sheet-collection* col iz_listo row cell cols) (defun Letter (N / Res TMP)(setq Res "")(while (> N 0)(setq TMP (rem N 26) TMP (if (zerop TMP)(setq N (1- N) TMP 26) TMP) Res (strcat (chr (+ 64 TMP)) Res) N (/ N 26))) Res) (if (null Name_list)(setq Name_list "")) (setq *AplExcel* (vlax-get-or-create-object "Excel.Application")) (if (setq *New-Book* (vlax-get-property *AplExcel* "ActiveWorkbook")) (setq *Books-Colection* (vlax-get-property *AplExcel* "Workbooks") *Sheet-Collection* (vlax-get-property *New-Book* "Sheets") *Sheet#1* (vlax-invoke-method *Sheet-Collection* "Add")) (setq *Books-Colection* (vlax-get-property *AplExcel* "Workbooks") *New-Book* (vlax-invoke-method *Books-Colection* "Add") *Sheet-Collection* (vlax-get-property *New-Book* "Sheets") *Sheet#1* (vlax-get-property *Sheet-Collection* "Item" 1))) (setq *excell-cells* (vlax-get-property *Sheet#1* "Cells")) (setq Name_list (if (= Name_list "") (vl-filename-base(getvar "DWGNAME")) (strcat (vl-filename-base(getvar "DWGNAME")) "&" Name_list)) col 0 cols nil) (if (> (strlen Name_list) 26) (setq Name_list (strcat (substr Name_list 1 10) "..." (substr Name_list (- (strlen Name_list) 13) 14)))) (vlax-for sh *Sheet-Collection* (setq cols (cons (strcase(vlax-get-property sh 'Name)) cols))) (setq row Name_list) (while (member (strcase row) cols)(setq row (strcat Name_list " (" (itoa(setq col (1+ col)))")"))) (setq Name_list row) (vlax-put-property *Sheet#1* 'Name Name_list) (setq Currsep (vlax-get-property *AplExcel* "UseSystemSeparators")) (vlax-put-property *AplExcel* "UseSystemSeparators" :vlax-false) ;_не использовать системные установки (vlax-put-property *AplExcel* "DecimalSeparator" ".") ;_разделитель дробной и целой части (vlax-put-property *AplExcel* "ThousandsSeparator" " ") ;_разделитель тысячей (vla-put-visible *AplExcel* :vlax-true)(setq row 1 col 1) (if (null header)(setq header '("X" "Y" "Z"))) (repeat (length header)(vlax-put-property *excell-cells* "Item" row col (vl-princ-to-string (nth (1- col) header)))(setq col (1+ col)))(setq row 2 col 1) (repeat (length Data-list)(setq iz_listo (car Data-list))(repeat (length iz_listo) (vlax-put-property *excell-cells* "Item" row col (vl-princ-to-string (car iz_listo))) (setq iz_listo (cdr iz_listo) col (1+ col)))(setq Data-list (cdr Data-list))(setq col 1 row (1+ row))) (setq col (1+(length header)) row (1+ row)) (setq cell (vlax-variant-value (vlax-invoke-method *Sheet#1* "Evaluate" (strcat "A1:" (letter col)(itoa row))))) ;_ end of setq (setq cols (vlax-get-property cell 'Columns)) (vlax-invoke-method cols 'Autofit) (vlax-release-object cols)(vlax-release-object cell) (foreach item ColHide (if (numberp item)(setq item (letter item))) (setq cell (vlax-variant-value (vlax-invoke-method *Sheet#1* "Evaluate" (strcat item "1:" item "1")))) (setq cols (vlax-get-property cell 'Columns)) (vlax-put-property cols 'hidden 1) (vlax-release-object cols)(vlax-release-object cell)) (vlax-put-property *AplExcel* "UseSystemSeparators" Currsep) (mapcar 'vlax-release-object (list *excell-cells* *Sheet#1* *Sheet-Collection* *New-Book* *Books-Colection* *AplExcel*))(setq *AplExcel* nil)(gc)(gc)(princ))
классня вещь ! но есть маленкий недочет - считает и не замкнутые контура - что не есть хорошо.
Модификация из #64 для подсчета ЗАМНКУТЫХ контуров
Пояснение для полилиний:
Полилиния будет считаться замкнутой, если установлено соответствующее свойство или
совпадают начальная и конечная точка с точностью до 1e-6.
;_Команда MAREA42 (defun c:MAREA42 (/ m ss clist temp) ;_Считает площади ЗАМКНУТЫХ контуров ;https://www.caduser.ru/forum/topic20298.html ; Владимир Азарко aka VVA для caduser.ru (defun sort (lst predicate) (mapcar '(lambda (x) (nth x lst)) (vl-sort-i lst predicate)) ) (defun combine (inlist is-greater is-equal / sorted current result) (setq sorted (sort inlist is-greater)) (setq current (list (car sorted))) (foreach item (cdr sorted) (if (apply is-equal (list item (car current))) (setq current (cons item current)) (progn (setq result (cons current result)) (setq current (list item)) ) ) ) (cons current result) ) (defun mlen4_1 (lst / sum_area) (setq sum_area 0) (foreach item (mapcar 'car lst) (setq sum_area (+ sum_area (if (and (vlax-property-available-p item 'area) (or (vlax-curve-isClosed item) (equal (vlax-curve-getStartPoint item) (vlax-curve-getEndPoint item) 1e-6 ) ) ) (vla-get-area item) 0 ) ;_ if ) ;_ + ) ) (if (not (zerop sum_area)) (princ (strcat "\n\t" (cdar lst) " = " (rtos (* sum_area m) 2 4)) ) ) (list (cdar lst)(rtos (* sum_area m) 2 4)) ) (vl-load-com) (if (null *M*)(setq *M* 1)) (initget 6) (and (princ "\nВведите маштабный коэффициент <") (princ *M*)(princ ">: ") (or (setq m (getreal)) (setq m *M*) ) (setq *M* m) (setq ss (ssget "_:L")) (setq ss (mapcar (function vlax-ename->vla-object) (vl-remove-if (function listp) (mapcar (function cadr) (ssnamex ss) ) ;_ mapcar ) ;_ vl-remove-if ) ) (mapcar '(lambda (x) (setq temp (cons (cons x (vla-get-Layer x)) temp)) ) ss ) (setq clist (combine temp '(lambda (a b) (> (cdr a) (cdr b)) ) '(lambda (a b) (eq (cdr a) (cdr b)) ) ) ) (princ "\n\n Общая площадь всех линейных примитивов по слоям:" ) (setq temp (mapcar 'mlen4_1 clist)) (xls temp '("Слой" "Площадь") nil "mlen41") ) (princ) ) ;_ defun ;|================== XLS ======================================== * Опубликовано https://www.caduser.ru/forum/topic19920.html https://www.caduser.ru/forum/topic31444.html https://www.caduser.ru/forum/topic31669.html * Автор: Владимир Азарко aka VVA * Назначение: Печать списка данных Data-list в Excell * Для вывода создается новый лист * Аргументы: Data-list — список списков данных (LIST) вида ((Value1 Value2 ... VlalueN)(Value1 Value2 ... VlalueN)...) Каждый список вида (Value1 Value2 ... VlalueN) записывается в отдельную строку в соответствующие столбцы (Value1-A Value2-B и .т.д.) header — список (LIST) заголовков или nil вида ("Подпись A" "Подпись B" ...) Если header nil, принимается ("X" "Y" "Z") Colhide — список буквенных названий стоблцов для скрытия или nil — не скрывать ("A" "C" "D") — скрыть столбцы A, C, D Name_list — имя нового листа активной книги или nil — новая книга * Возврат: nil * TIPS!!! : При передачи функции xls числовых вещественных данных нет необходимости проверять текущий системный разделитель целой и дробной части ("HKEY_CURRENT_USER\\Control Panel\\International" "sDecimal") Функцией на время вывода отключается использование в Excele системного разделителя, разделителем целой и дробной части устанавливается точка. После завершения ф-ции все восстанавливается. Пример вызова (xls '((1.1 1.2 1.3 1.4)(2.1 2.2 2.3 2.4)(3.1 3.2 3.3 3.4)) '("Столбец1" "Столбец2" "Столбец3" "Столбец4") '("B"))|; (vl-load-com) (defun xls ( Data-list header Colhide Name_list / *aplexcel* *books-colection* Currsep *excell-cells* *new-book* *sheet#1* *sheet-collection* col iz_listo row cell cols) (defun Letter (N / Res TMP)(setq Res "")(while (> N 0)(setq TMP (rem N 26) TMP (if (zerop TMP)(setq N (1- N) TMP 26) TMP) Res (strcat (chr (+ 64 TMP)) Res) N (/ N 26))) Res) (if (null Name_list)(setq Name_list "")) (setq *AplExcel* (vlax-get-or-create-object "Excel.Application")) (if (setq *New-Book* (vlax-get-property *AplExcel* "ActiveWorkbook")) (setq *Books-Colection* (vlax-get-property *AplExcel* "Workbooks") *Sheet-Collection* (vlax-get-property *New-Book* "Sheets") *Sheet#1* (vlax-invoke-method *Sheet-Collection* "Add")) (setq *Books-Colection* (vlax-get-property *AplExcel* "Workbooks") *New-Book* (vlax-invoke-method *Books-Colection* "Add") *Sheet-Collection* (vlax-get-property *New-Book* "Sheets") *Sheet#1* (vlax-get-property *Sheet-Collection* "Item" 1))) (setq *excell-cells* (vlax-get-property *Sheet#1* "Cells")) (setq Name_list (if (= Name_list "") (vl-filename-base(getvar "DWGNAME")) (strcat (vl-filename-base(getvar "DWGNAME")) "&" Name_list)) col 0 cols nil) (if (> (strlen Name_list) 26) (setq Name_list (strcat (substr Name_list 1 10) "..." (substr Name_list (- (strlen Name_list) 13) 14)))) (vlax-for sh *Sheet-Collection* (setq cols (cons (strcase(vlax-get-property sh 'Name)) cols))) (setq row Name_list) (while (member (strcase row) cols)(setq row (strcat Name_list " (" (itoa(setq col (1+ col)))")"))) (setq Name_list row) (vlax-put-property *Sheet#1* 'Name Name_list) (setq Currsep (vlax-get-property *AplExcel* "UseSystemSeparators")) (vlax-put-property *AplExcel* "UseSystemSeparators" :vlax-false) ;_не использовать системные установки (vlax-put-property *AplExcel* "DecimalSeparator" ".") ;_разделитель дробной и целой части (vlax-put-property *AplExcel* "ThousandsSeparator" " ") ;_разделитель тысячей (vla-put-visible *AplExcel* :vlax-true)(setq row 1 col 1) (if (null header)(setq header '("X" "Y" "Z"))) (repeat (length header)(vlax-put-property *excell-cells* "Item" row col (vl-princ-to-string (nth (1- col) header)))(setq col (1+ col)))(setq row 2 col 1) (repeat (length Data-list)(setq iz_listo (car Data-list))(repeat (length iz_listo) (vlax-put-property *excell-cells* "Item" row col (vl-princ-to-string (car iz_listo))) (setq iz_listo (cdr iz_listo) col (1+ col)))(setq Data-list (cdr Data-list))(setq col 1 row (1+ row))) (setq col (1+(length header)) row (1+ row)) (setq cell (vlax-variant-value (vlax-invoke-method *Sheet#1* "Evaluate" (strcat "A1:" (letter col)(itoa row))))) ;_ end of setq (setq cols (vlax-get-property cell 'Columns)) (vlax-invoke-method cols 'Autofit) (vlax-release-object cols)(vlax-release-object cell) (foreach item ColHide (if (numberp item)(setq item (letter item))) (setq cell (vlax-variant-value (vlax-invoke-method *Sheet#1* "Evaluate" (strcat item "1:" item "1")))) (setq cols (vlax-get-property cell 'Columns)) (vlax-put-property cols 'hidden 1) (vlax-release-object cols)(vlax-release-object cell)) (vlax-put-property *AplExcel* "UseSystemSeparators" Currsep) (mapcar 'vlax-release-object (list *excell-cells* *Sheet#1* *Sheet-Collection* *New-Book* *Books-Colection* *AplExcel*))(setq *AplExcel* nil)(gc)(gc)(princ))
СПАСИБО огромное очень помогло в работе.А можно ли слегка его усовершенствовать путем выбора 1контура внутри которого бы распологались полилинии на различных слоях?
А ничего усовершенствовать не нужно
1. Берем отсюда LISP.Выделение объектов в области контура или отсюда Выделение объектов в области контура, AutoCAD команды SCWP или SCCP
2. Выделяем и их помощью объекты внутри контура
3. Используем MAREA42
[FONT=Arial]!!! Обращаем внимание на то, что системная переменная PICKFIRST должна быть = 1[/FONT]
Круто! :!: но это не много не то.(или я чего то не понял). Площадь необходимо посчитать ВСЮ внутри замкнутого контура,а как быть если "внутренний" контур выходит за пределы внешнего.
порывшись на форуме нашел вот это (http://forum.dwg.ru/showthread.php?p=98053#post98053) пост 8 это почти про меня. изменилось ли что с 2008 года?
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → Готовые программы → LISP. Подсчет длины линий на определенном слое
Форум работает на PunBB, при поддержке Informer Technologies, Inc