Длины кабеля с плана
Ведомость кабелей одной командой: длины линий по слоям с марками, запасом и добавками — таблица в чертёж и CSV. Пообъектный кабельный журнал «откуда — куда» по подписям адресации. Команда-трасса с живым счётчиком метров.
1. Слои кабеля и марки
Каждая линия модели относится к первому правилу, чья маска слоёв совпала. Правило с маркой сливает свои слои в одну строку ведомости; правило без марки даёт строку на каждый слой. Добавка — метры на вертикали (стояки, спуски к прибору) к строке ведомости.
2. Запас и единицы
Пример: 100 м по плану → 110 м в ведомости. Считаются отрезки, полилинии (включая дуговые сегменты), дуги и сплайны пространства модели; длина берётся по кривой.
3. Команда-трасса
Прямоугольная разводка — как обычно, клавишей F8 (орто). Автопрокладки вдоль стен нет сознательно: в чертеже стены неотличимы от прочих линий, честнее вести трассу рукой со счётчиком, чем рисовать «красивую» трассу мимо коробов.
4. Пообъектный кабельный журнал
5. Скрипт
Показать текст LSP
;; ПоНорме (ponorme.ru) — длины кабеля с плана.
;; ЖУРНАЛ — ведомость: длины линий модели по правилам «маска слоёв — марка»,
;; запас 10 %, добавки на вертикали, отчёт, таблица в чертёж, CSV.
;; ТРАССА — трасса по щелчкам с живым счётчиком длины на текущем слое.
;; Загрузка: перетащить .lsp в окно чертежа или APPLOAD.
;; длина кривой в единицах чертежа; nil — объект не кривая
(defun pnrm:cab-len (e / q)
(if (not (vl-catch-all-error-p (setq q (vl-catch-all-apply 'vlax-curve-getendparam (list e)))))
(vlax-curve-getdistatparam e q)))
;; единицы чертежа в метры: запас, добавка и округление вверх
(defun pnrm:cab-m (u extra / v k)
(setq v (+ (* (/ u 1000.0) 1.1) extra))
(setq k (fix (/ v 1.0)))
(if (> v (+ (* k 1.0) 1.0e-6)) (setq k (1+ k)))
(* k 1.0))
(defun c:ЖУРНАЛ (/ *error* doc ss i e lay grp key len data pair total m pt tbl r fn f)
(vl-load-com)
(setq doc (vla-get-ActiveDocument (vlax-get-acad-object)) data nil)
(defun *error* (msg)
(if f (close f))
(vl-catch-all-apply 'vla-EndUndoMark (list doc))
(princ))
(setq ss (ssget "_X" '((0 . "LINE,LWPOLYLINE,POLYLINE,ARC,SPLINE") (410 . "Model"))))
(if (not ss)
(princ "\nЛиний в модели не найдено.")
(progn
(setq i 0)
(repeat (sslength ss)
(setq e (ssname ss i) i (1+ i)
lay (strcase (cdr (assoc 8 (entget e))))
grp (cond
((wcmatch lay "*") (list nil 0.0)) ; без марки — по имени слоя
(t nil)))
(if (and grp (setq len (pnrm:cab-len e)))
(progn
(setq key (if (car grp) (car grp) lay))
(setq pair (assoc key data))
(if pair
(setq data (subst (list key (+ (cadr pair) len) (caddr pair)) pair data))
(setq data (append data (list (list key len (cadr grp)))))))))
(if (not data)
(princ "\nПод маски правил не попала ни одна линия.")
(progn
(princ "\nВедомость кабелей:")
(setq total 0.0)
(foreach x data
(setq m (pnrm:cab-m (cadr x) (caddr x)) total (+ total m))
(princ (strcat "\n " (car x) " — " (rtos m 2 0) " м")))
(princ (strcat "\nВсего с запасом 10 %: " (rtos total 2 0) " м."))
;; таблица в чертёж (Enter — пропустить)
(if (setq pt (getpoint "\nТочка вставки таблицы <пропустить>: "))
(progn
(vla-StartUndoMark doc)
(setq tbl (vla-AddTable (vla-get-ModelSpace doc)
(vlax-3d-point (trans pt 1 0)) (+ 3 (length data)) 3 8.0 60.0))
(vla-put-RegenerateTableSuppressed tbl :vlax-true)
(vla-SetColumnWidth tbl 0 160.0) (vla-SetColumnWidth tbl 1 45.0) (vla-SetColumnWidth tbl 2 45.0)
(vla-SetText tbl 0 0 "Ведомость кабелей")
(vla-SetText tbl 1 0 "Марка / слой")
(vla-SetText tbl 1 1 "По плану, м")
(vla-SetText tbl 1 2 "С запасом 10 %, м")
(setq r 2)
(foreach x data
(vla-SetText tbl r 0 (car x))
(vla-SetText tbl r 1 (rtos (/ (cadr x) 1000.0) 2 1))
(vla-SetText tbl r 2 (rtos (pnrm:cab-m (cadr x) (caddr x)) 2 0))
(setq r (1+ r)))
(vla-SetText tbl r 0 "Всего") (vla-SetText tbl r 2 (rtos total 2 0))
(vla-put-RegenerateTableSuppressed tbl :vlax-false)
(vla-EndUndoMark doc)))
;; CSV для Excel (Отмена — пропустить); десятичная — запятая
(if (setq fn (getfiled "Сохранить ведомость CSV" "" "csv" 1))
(progn
(setq f (open fn "w"))
(write-line "Марка/слой;По плану, м;С запасом 10 %, м" f)
(foreach x data
(write-line (strcat (car x) ";"
(vl-string-translate "." "," (rtos (/ (cadr x) 1000.0) 2 1)) ";"
(vl-string-translate "." "," (rtos (pnrm:cab-m (cadr x) (caddr x)) 2 0))) f))
(write-line (strcat "Всего;;" (vl-string-translate "." "," (rtos total 2 0))) f)
(close f) (setq f nil)
(princ (strcat "\nСохранено: " fn))))
))))
(princ))
(defun c:ТРАССА (/ *error* doc p1 p2 pts len seg last)
(vl-load-com)
(setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
(defun *error* (msg)
(vl-catch-all-apply 'vla-EndUndoMark (list doc))
(princ))
(setq p1 (getpoint "\nНачало трассы (орто — F8): "))
(if p1
(progn
(vla-StartUndoMark doc)
(setq pts (list (trans p1 1 0)) len 0.0)
(while (setq p2 (getpoint p1 (strcat "\nСледующая точка (по плану "
(rtos (/ len 1000.0) 2 1) " м, Enter — завершить): ")))
(setq seg (distance (trans p1 1 0) (trans p2 1 0))
len (+ len seg)
pts (cons (trans p2 1 0) pts)
p1 p2))
(if (> (length pts) 1)
(progn
(setq last (car pts))
(entmake (append
(list (cons 0 "LWPOLYLINE") (cons 100 "AcDbEntity") (cons 8 (getvar "CLAYER"))
(cons 100 "AcDbPolyline") (cons 90 (length pts)) (cons 70 0))
(mapcar '(lambda (p) (cons 10 (list (car p) (cadr p)))) (reverse pts))))
;; подпись длины по плану у конца трассы
(entmake (list (cons 0 "TEXT") (cons 8 (getvar "CLAYER")) (cons 7 (getvar "TEXTSTYLE"))
(cons 10 (mapcar '+ last (list 2.5 2.5 0.0)))
(cons 40 2.5)
(cons 1 (strcat (vl-string-translate "." "," (rtos (/ len 1000.0) 2 1)) " м"))))
(princ (strcat "\nТрасса на слое " (getvar "CLAYER") ": "
(rtos (/ len 1000.0) 2 1) " м по плану, "
(rtos (pnrm:cab-m len 0.0) 2 0) " м с запасом 10 %."))))
(vla-EndUndoMark doc)))
(princ))
(princ "\nПоНорме: команды ЖУРНАЛ и ТРАССА загружены.")
(princ)
Как подключить и пользоваться
- Разово: перетащите скачанный .lsp в окно чертежа — или команда ЗАГПРИЛ (_APPLOAD) → выбрать файл → «Загрузить».
- Навсегда: в том же окне APPLOAD добавьте файл в «Приложения, загружаемые с автозагрузкой» (Startup Suite).
- ЖУРНАЛ печатает ведомость в командную строку, затем спрашивает точку вставки таблицы (Enter — пропустить), затем путь CSV (Отмена — пропустить).
- ТРАССА: сначала выберите слой кабеля текущим, затем щёлкайте точки — метры набегают в подсказке; Enter завершает полилинию и подписывает длину.
- Файл в кодировке ANSI (cp1251) — как принято для AutoLISP с русским текстом. nanoCAD загружает те же .lsp.
Справка
Назначение и исходные условия
Сколько кабеля заказывать — вопрос, на который план уже ответил: линии начерчены по слоям, осталось честно их измерить. Команда суммирует длины отрезков, полилиний, дуг и сплайнов пространства модели по правилам «маска слоёв → марка кабеля», добавляет запас на провис и разделку, метры на вертикали (стояки, спуски к приборам) и округляет вверх до целого метра. Итог — ведомость в командной строке, таблица прямо в чертёж и CSV для Excel с запятой-десятичной. Вставленная таблица убирается одним шагом отмены (U).
Правила работают как в спецификации с плана: первое совпадение маски выигрывает. Правило с маркой сливает слои ШС и ДПЛС в одну строку «КПСнг(А)-FRLS 1х2х0,5 — 240 м»; правило без марки даёт строку на каждый слой — удобно для быстрой прикидки по чужому чертежу маской «*».
Третья команда — пообъектный кабельный журнал: для каждой линии по маскам правил она находит подписи адресации у концов (TEXT на слое адресов или атрибут блока — те же слой «АДРЕСА» и тег «АДРЕС», что ставит нумерация и адресация датчиков) и пишет CSV со строками «№ · марка · откуда · куда · длина». Линии без подписи получают «?» и подсчитываются — команда подскажет дописать адреса или увеличить радиус поиска.
Вторая команда — трасса: та же полилиния по щелчкам, но набранные метры показываются прямо в подсказке следующей точки, а длина подписывается у конца. Прямоугольная разводка — штатным орто (F8). Автопрокладки вдоль стен здесь нет сознательно: в DWG стена неотличима от любой другой линии, и «умная» трасса мимо реальных коробов хуже честной ручной со счётчиком.
Частые вопросы
Что считается длиной линии?
Длина по кривой: отрезки, полилинии (включая дуговые сегменты), дуги и сплайны пространства модели. Окружности, тексты и блоки не считаются. Каждая линия относится к первому правилу, чья маска слоёв совпала.
Как задаётся марка кабеля?
В правиле: маска слоёв → марка. Правило с маркой сливает все совпавшие слои в одну строку ведомости; правило без марки даёт строку на каждый слой с его именем. Знак «×» в марке автоматически заменяется русской «х»: в кодировке cp1251, в которой сохраняются LSP и CSV, символа «×» нет — да и в марках кабеля по каталогам пишется именно буква «х».
Откуда берётся запас и что за добавка?
Запас в процентах покрывает провис, разделку и неточность плана — обычно 10–15 %. Добавка в метрах — вертикальные участки, которых на плане нет: стояки между этажами, спуски к приборам; она прибавляется к строке ведомости после запаса. Итог округляется вверх до заданного шага.
Это кабельный журнал?
Обе формы. Ведомость — длины по маркам, итоговая строка журнала. Пообъектный журнал «№ — марка — откуда — куда — длина» строит третья команда: у концов каждой линии она ищет подписи адресации (TEXT на слое адресов или атрибут блока — те же слой «АДРЕСА» и тег «АДРЕС», что ставит наш инструмент нумерации) и пишет CSV. Линии без подписи попадают в журнал с «?» и подсчитываются — это подсказка дописать адреса или увеличить радиус поиска.
Зачем команда-трасса, если есть полилиния?
Это и есть полилиния, но набранные метры видны прямо в подсказке следующей точки, а в конце длина подписывается текстом. Прямоугольная разводка — штатной клавишей F8. Автопрокладки вдоль стен нет сознательно: в чертеже стены неотличимы от прочих линий.
Работает ли в AutoCAD LT и nanoCAD?
Полный AutoCAD и nanoCAD — да. AutoCAD LT 2023 и старше — нет (там нет AutoLISP); в LT 2024+ AutoLISP появился и, по справке Autodesk, используемые vla-/vlax-функции поддерживаются (внешние COM-объекты — нет), однако на LT работа не проверялась. CSV пишется с запятой-десятичной, русский Excel открывает его сразу.
Связанные расчёты
Нашли неточность — в формуле, числе или ссылке на пункт нормы? Напишите нам — проверим по первоисточнику и поправим. Замечания практиков уже не раз делали сервис точнее.
Данный сервис является справочным инструментом — окончательное решение принимается проектировщиком.