Тема: Формирование каталогов координат полилиний ???

Доброго времени суток!
Есть такая проблема: для отчетных документов очень часто требуется каталог координат, дир. углов и длин линий участка - полилинии. Средствами AutoCAD это сделать довольно проблематично :(.
Если кто может помогите пожайлуста: неоходима утилитка формирующая каталог координат полилинии с дир углами и длинами линии, с указанием площади и периметра с  выводом в файл (.txt, .doc)или построением таблицы в AutoCADе.
Для одного участка это воможно с помощью средств Land (Tag Labels - Line Table) а  что делать если участков 100???

Re: Формирование каталогов координат полилиний ???

Поиск пробовал? Все уже давно придумано. Впрочем, если ты к поискам в сети неспособный, держи прогу. С EXCEL'ом, надеюсь, работать умеешь?

;Вывод снформации щ вершинах полилиний в EXCEL в виде таблицы
;Номер | X | Y | Z | дистанция | Угол в радианах
;-------------------------
(defun C:PLtoEx (/ books c ccells cols dat excel k nbook next sheet sheets torel)
  (vl-load-com)
  (if (setq excel (vlax-get-or-create-object "Excel.Application"))
    (progn (setq books  (vlax-get-property excel 'workbooks)
                 nbook  (vlax-invoke-method books 'add 1)
                 sheets (vlax-get-property nbook 'worksheets)
                 sheet  (vlax-get-property nbook 'activesheet)
                 dat    (pl:get-apr-data)
                 c      0)
      (princ (strcat "\nПоиск точек завершён. Обработано полилиний: "
             (itoa (length dat))
             "\nНачинается сброс данных в Excel. Пожалуйста, ждите!"))
      (foreach v dat
    (princ (strcat "\nПолилиния: " (itoa (setq c (1+ c))) ", узлов: "
               (rtos (length v) 2 0)))
    (if next (setq torel (cons sheet torel) sheet (vlax-invoke-method sheets 'add)));if
    (setq ccells (vlax-get-property sheet 'cells)
          cols (vlax-get-property sheet 'columns) i 0);setq
    (foreach y v (setq i (1+ i) k 0)
      (foreach x y (setq k (1+ k)) (pl:put-real-to-cell ccells i k x)));foreach y
    (vlax-invoke-method cols 'autofit)
        (vlax-release-object cols)
        (vlax-release-object ccells)
        (setq next t)
      );foreach v
      (if torel (vlax-invoke-method (last torel) 'activate))
      (if (= (vlax-get-property excel 'visible) :vlax-false)
    (vlax-put-property excel 'visible :vlax-true))
      (foreach x (cons sheet
               (if torel (append torel (list sheets nbook books excel))
             (list sheets nbook books excel)));cons
    (vlax-release-object x));foreach x
    );progn
    (alert "Не могу запустить Excel!"));if
  (princ)
);end
;
(defun pl:get-apr-data (/ adoc ass coor par dist ang temp res)
  (setq adoc (vla-get-activedocument (vlax-get-acad-object))
        ass (vla-get-activeselectionset adoc))
  (vla-clear ass)
  (vla-selectonscreen ass
    (vlax-safearray-fill (vlax-make-safearray vlax-vbinteger '(0 . 0)) '(0))
    (vlax-safearray-fill (vlax-make-safearray vlax-vbvariant '(0 . 0)) '("*POLYLINE")))
  (vlax-for pl ass
    (setq coor (vlax-get pl 'Coordinates)
          par (vlax-curve-getEndparam pl))
    (while (>= par 0)
      (setq dist (apply '- (mapcar '(lambda (x) (vlax-curve-getDistAtParam pl x))
                             (list par (if (/= par 0) (1- par) 0))))
            coor (vlax-curve-getPointAtParam pl par)
            ang (angle '(0 0 0) (vlax-curve-getFirstDeriv pl par))
            temp (cons (cons (rtos par) (append coor (list dist ang))) temp)
            par (1- par)));while
    (setq res (cons temp res)));vlax-for
);defun
;
(defun pl:lst-to-lsts (lst modul / _pl:lst-to-lsts)
  (defun _pl:lst-to-lsts (slst i mod / tmp)
    (cond ((not slst) nil)
          ((zerop i) (cons (list (car slst)) (_pl:lst-to-lsts (cdr slst) mod mod)))
          (t (setq tmp (_pl:lst-to-lsts (cdr slst) (1- i) mod))
       (cons (cons (car slst) (car tmp)) (cdr tmp))));cond
  );drfun
  (_pl:lst-to-lsts lst (1- modul) (1- modul))
);dfun
;
(defun pl:put-real-to-cell (ccells x y val)
  (vlax-put-property (vlax-variant-value (vlax-get-property ccells 'item
        (vlax-make-variant x vlax-vbinteger) (vlax-make-variant y vlax-vbinteger)))
    "Value2" (vlax-make-variant val vlax-vbdouble))
);defun

Re: Формирование каталогов координат полилиний ???

Большое спасибо. Поиском я немного умею пользоваться но не нашел ничего подходящего.. То что вы любезно представили тоже подходит не совсем... Если участков более сотни то редактирование вашего файла дли предания ему нормального вида каталога кординат с указанием площади и периметра прийдется потратить уйму времени :(
Хтелось бы получать что-то в примерно таком виде:
--------------------------------------------------------
  N  |       КООРДИНАТЫ      |    Меры   |  Дирекционные
точки|     X     |     Y     |   линий   |      углы
-----|-----------|-----------|-----------|--------------
1      16322.25    25559.55
                                     0.50  295° 29' 16"
2      16322.47    25559.10
                                     0.50   25° 29' 16"
3      16322.92    25559.32
                                     0.50  115° 29' 16"
4      16322.70    25559.77
                                     0.50  205° 29' 16"
1      16322.25    25559.55
========================================================
          Площадь объекта  0.25 (м.кв.)
          Периметр объекта 2.0 (м)

Re: Формирование каталогов координат полилиний ???

Таблица не прошла в корректном виде...:((

Re: Формирование каталогов координат полилиний ???

> master
А специальных программ, как говорится заточенных под это, не не иметься в наличии. Например Civil и ему подобные.

Re: Формирование каталогов координат полилиний ???

Писал по быстрому на работе так что не обессуть :).
А линии в табличке сам подгонять будешь - слишком муторно.
Проверь на глюки - вполне могут быть.

(defun katalog (/ pl_nabor fname)
  (vl-load-com)
  (if
    (and
      (setq pl_nabor (ssget '((0 . "lwpolyline"))))
      (setq fname (getfiled "Выберите файл" "" "txt" 5))
    )
     (data-v-file
       fname
       (mapcar
     '(lambda (x / list_kt dlina)
        (setq list_kt (mapcar 'cdr
                  (vl-remove-if-not
                    '(lambda (y) (= (car y) 10))
                    (entget x)
                  )
              )
        )
        (if    (zerop (cdr (assoc 70 (entget x))))
          (setq list_kt (reverse (cdr (reverse list_kt))))
        )
        (setq
          dlina
           (mapcar
         '(lambda (z)
            (if    (/= (1+ (vl-position z list_kt))
                (length list_kt)
            )
              (list
            (distance
              z
              (nth (1+ (vl-position z list_kt)) list_kt)
            )
            (cond
              (
               (>
                 (setq ang
                    (angle
                      z
                      (nth (1+ (vl-position z list_kt))
                       list_kt
                      )
                    )
                 )
                 (/ pi 2)
               )
               (- (+ (* pi 2) (/ pi 2)) ang)
              )
              (t
               (- (/ pi 2) ang)
              )
            )
              )
              (list
            (distance z (car list_kt))
            (cond
              (
               (>
                 (setq ang
                    (angle z (car list_kt))
                 )
                 (/ pi 2)
               )
               (- (+ (* pi 2) (/ pi 2)) ang)
              )
              (t
               (- (/ pi 2) ang)
              )
            )
              )
            )
          )
         list_kt
           )
        )
        (list
          list_kt
          dlina
          (apply '+ (mapcar 'car dlina))
          (vlax-curve-getarea (vlax-ename->vla-object x))
        )
      )
     (vl-remove-if 'listp (mapcar 'cadr (ssnamex pl_nabor)))
       )
     )
  )
)
(defun data-v-file (fnam data / deskr)
  (if
    (setq deskr (open fnam "w"))
     (progn
       (foreach    i data
     (setq j 1)
     (write-line
       "_________________________________________________________________________"
       deskr
     )
     (write-line
       (strcat "N точки"    "\t"         "|"      "Координаты"
           "\t"        "\t"         "|"      "Меры линий"
           "\t"        "|"         "Дирекционные углы"
           "\t"        "|"
          )
       deskr
     )
     (write-line
       "_________________________________________________________________________"
       deskr
     )
     (mapcar '(lambda (a b)
            (write-line
              (strcat (itoa j)
                  "\t"
                  (rtos (car a) 2 2)
                  "\t"
                  (rtos (cadr a) 2 2)
                  "\t"
                  "\t"
                  (rtos (car b) 2 2)
                  "\t"
                  "\t"
                  (angtos (cadr b) 1 4)
              )
              deskr
            )
            (setq j (1+ j))
          )
         (car i)
         (cadr i)
     )
     (write-line
       "========================================================================="
       deskr
     )
     (write-line
       (strcat "Площадь объекта-" (rtos (nth 2 i) 2 2))
       deskr
     )
     (write-line
       (strcat "Периметр объекта-" (rtos (nth 3 i) 2 2))
       deskr
     )
       )
       (close deskr)
     )
  )
)

Re: Формирование каталогов координат полилиний ???

> Эдуард Смолянка
Эдуард,
я в геодезии нулллль, но шедевр!
Regards,
~'J'~

Re: Формирование каталогов координат полилиний ???

> Fatty
Спасибо.
До шедевра далеко. Была цель - успеть дописать до 18.00  :)
Из геодезии там только определение дирекционного угла из автокадовского.
А так есть что оптимизировать:
1.Точность значений
2.Подгонка линий таблицы
3.Да и код можно слегка упростить-есть повторы.

Re: Формирование каталогов координат полилиний ???

> Эдуард Смолянка
Я дирекционный угол для своих нужд вычисляю следующим способом (как правило он нужен в представлении гадусы, минуты, секунды)

(mapcar 'setvar '("ANGDIR" "ANGBASE") (list 0 0))
(setq ang (getangle "\nУкажите угол:"))
(mapcar 'setvar '("ANGDIR" "ANGBASE") (list 1 (* 0.5 PI)))
(setq Dirang (angtos ang 1 4))
(mapcar 'setvar '("ANGDIR" "ANGBASE") (list 0 0))
(setq CurrAng (angtos ang 1 4))
(princ "\nУказанный угол: ")(princ CurrAng)
(princ "\nДирекционный угол: ")(princ DirAng)

Re: Формирование каталогов координат полилиний ???

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

Re: Формирование каталогов координат полилиний ???

Скажите а как сделать представление: градусы минуты,десятые минут? И вывод без этой акадовской "d"

Re: Формирование каталогов координат полилиний ???

(vl-load-com)
(setq ang (getangle "\nУкажите угол:"))
(princ "\nУказанный угол до минут: ")
(princ(vl-string-subst  " градус " "d" (angtos ang 1 2)))
(princ "\nУказанный угол до секунд: ")
(princ(vl-string-subst  " градус " "d" (angtos ang 1 3)))

Re: Формирование каталогов координат полилиний ???

> [Re:] VVA
Неа не то! До минут и до десятых минут! Например:

134 45 34

, а на выход

134 45.57

.

Re: Формирование каталогов координат полилиний ???

> G_RAV
А самому сесть и посчитать?

(setq ang (getangle "\nУкажите угол:"))
(setq ang (/ (* ang 180) pi))
(setq gradus (fix ang))
(setq minut (* (rem ang 1) 60.0))
(princ "\nУказанный угол ")(princ gradus)(princ " градусов ")
(princ minut)(princ " минут")

Re: Формирование каталогов координат полилиний ???

Дык я и считал, только это не самое главное, а главное в каком виде угол будет отображен и у меня все так сложно, но все-таки вышло:
-сначала я отделил от угла градус, избавился от "d"
-затем отделил минуты избавился от "'"
-затем отделил секунды, разделил на 60
-а в оконцовке все соеденил "СЛОЖНО ВСЕ КОРОЧЕ ВЫШЛО"---> фрагмент:

;;;;;;  ГРАДУСЫ
(setq an1_1 (substr an3 4 1))
(setq an1_2 (substr an3 3 1))
(setq an1_3 (substr an3 2 1))
(if ( = an1_1  "d") (setq an_g1 (substr an3 1 3)))
(if ( = an1_2  "d") (setq an_g1 (strcat " "(substr an3 1 2))))
(if ( = an1_3  "d") (setq an_g1 (strcat "  "(substr an3 1 1))))
(setq an_g (strcat an_g1 "  "))
;;;;;;  МИНУТКИ
(if ( = an1_1  "d") (setq an_m (strcat (substr an3 5 2))))
(if ( = an1_2  "d") (setq an_m (strcat (substr an3 4 2))))
(if ( = an1_3  "d") (setq an_m (strcat (substr an3 3 2))))
  (setq an_m2 (substr an_m 2 1))
  (if ( = an_m2  "'") (setq an_m (strcat "0" (substr an_m 1 1))))
;;;;;;  ДЕСЯТЫЕ СЕКУНД
 (setq an3_1(substr an3 11 1))
 (setq an3_2(substr an3 10 1))
 (setq an3_3(substr an3 9 1))
 (setq an3_4(substr an3 8 1))
 (setq an3_5(substr an3 7 1))
  (if ( = an3_1  "") (setq an_s (strcat(substr an3 8 2) )))
  (if ( = an3_2  "") (setq an_s (strcat(substr an3 7 2) )))
  (if ( = an3_3  "") (setq an_s (strcat(substr an3 6 2) )))
  (if ( = an3_4  "") (setq an_s (strcat(substr an3 5 2) )))
  (if ( = an3_5  "") (setq an_s (strcat(substr an3 4 2) )))
  (setq an_s1 (substr an_s 1 1))
  (if ( = an_s1  "'") (setq an_s (strcat "0" (substr an_s 2 1) )))
 (setq an_s1 (/ (atof an_s)60))
 (setq an_s2 (rtos an_s1 2 1))
  (setq an_ds (strcat(substr an_s2 2 3)))
  (setq an1 (strcat an_g an_m an_ds))

Re: Формирование каталогов координат полилиний ???

Существует программа, которая работает по следующему принципу:
1. Выбираешь полигон
2. Выбираешь маркировку точки т.е. (1) или (н1) или (п1)
--------------------------------------------------
3. На полигоне проставляются точки (двг-блок-"piket1") и нумерация точек
4. Ближе к началу координат создается список с номерами точек и их координатами
Сама программа:

(defun jop (nkoh / katt katal ka kat fal)
  (setq NKOH (car(entsel"\nВыберите объект : ")))
  (setq NKOH1 (vlax-ename->vla-object nkoh))
  (vlax-dump-object NKOH1)
 (setq katt (vla-get-coordinates nkoh1))
  (setq katal (safearray-value (vlax-variant-value katt)))
(setq fal (open "c:/data/katalog.dat" "w"))
  (setq n (length katal))
  (setq ss 0)
    (while (< ss (1- n))
    (setq x (nth ss katal));извлечение икса
    (setq y (nth (1+ ss) katal));извлечение игрека
    (setq pt1 (list x y));получение пикета
    (setq ss (+ ss 2))
    (princ ";" fal)
    (princ (rtos y 2 2) fal);печать в файл икса
    (princ ";" fal)
    (princ (rtos x 2 2) fal);печать в файл игрека
    (setq uu pt1)
    (setq ka (cons uu ka)))
  (setq kat (reverse ka));формирование списка с координатами
  (setq lb (getstring"\nВведите маркировку точки : "))
(setq n (length kat))
(setq s 0)
(setq num 1)
(setq nuu num)
(setq num1 num)
(setq pto '(153.1555 153.00))
(while (< s n)
    (setq kt (nth s kat))
(setq kt2 (nth (1+ s) kat))
(if (= kt2 nil) (setq num1 (- nuu 1)) )
(if (= kt2 nil) (setq kt2 (nth 0 kat)) )
    (command"insert" "piket1" kt "1" "" "0")
    (setq kt1 (polar kt 0 3))
(setq numt (itoa num))
(setq numl (strcat lb numt))
    (command"text" kt1 "0" numl)
(setq pti (polar pto 4.7124 4.0))
(setq pto pti)
(setq ptdir (polar pti 0 24.72))
(setq ptd (polar pti 0 49.00))
  (setq dst (rtos (distance kt kt2) 2 2))
(setq n1 (strcat lb (itoa num)))
(setq num1 (1+ num1))
(setq n2 (strcat lb (itoa num1)))
(setq nd (strcat n1 "-" n2))
  (setq katx (rtos (cadr kt) 2 2))
(setq katy (rtos (car kt) 2 2))
(command"text" "m" pti "0" numl)
(command"text" "m" ptdir "0" katx)
(command"text" "m" ptd "0" katy)
    (setq num (1+ num))
    (setq s (+ s 1)))
  (setq katt nil)(close fal)
  )
(vl-load-com)
(jop nkoh)

Помогите сделать так чтобы:
1. в списке 1-я точка с координатами была и последняя (т.е. 12345....1)
2. можно было дать описание точкам в интервале 1 до n т.е.:
- "введите описание"-->допустим описание1
- "введите интервал"-->допустим от 1 до 3
ВИД:
     1            X1        Y1    Описание1
     2            X2        Y2    Описание1
     3            X3        Y3    Описание1
     4            X4        Y4    Описание2
     ****************************************************
     1   
3. в конце списка следующей строкой прописывалась площадь объекта
4. следом можно было выбрать еще полигон или скажем n-полигонов:
"Выберите еще объкт"
"Продолжить нумерацию? Да - 1, Нет - 2"
"Введите название объекта?" '(строкой ниже площади предидущего объкта, но выше следующего списка)
Общий вид:
     1            X1        Y1    Описание1
     2            X2        Y2    Описание1
     3            X3        Y3    Описание1
     4            X4        Y4    Описание2
     ****************************************************
     1            X1        Y1    Описаниеn
     Площадь объекта составила S кв.м.
     Объект 2
     5    тоже самое
     6  тоже самое
     7  тоже самое
     8  тоже самое
     ****************************************************
     5
     Площадь объекта№2 составила S2 кв.м.
ПОМОГИТЕ, ПОЖАЛУЙСТА!!!

Re: Формирование каталогов координат полилиний ???

> Эдуард Смолянка
Я немного поправил ваш код, так, чтоб он в exel отправлял. но там сдвиг получается и длины под дир. углами получаются... а дир. углы дальше сдвигаются. (на более моего умения програмированния не хватило, так как первый раз что либо програмировал:))
вот мой вариант:
(defun katalog (/ pl_nabor fname)
  (vl-load-com)
  (if
    (and
      (setq pl_nabor (ssget '((0 . "lwpolyline"))))
      (setq fname (getfiled "Выберите файл" "" "xls" 5))
    )
     (data-v-file
       fname
       (mapcar
   '(lambda (x / list_kt dlina)
      (setq list_kt (mapcar 'cdr
          (vl-remove-if-not
            '(lambda (y) (= (car y) 10))
            (entget x)
          )
        )
      )
      (if  (zerop (cdr (assoc 70 (entget x))))
        (setq list_kt (reverse (cdr (reverse list_kt))))
      )
      (setq
        dlina
         (mapcar
     '(lambda (z)
        (if  (/= (1+ (vl-position z list_kt))
          (length list_kt)
      )
          (list
      (distance
        z
        (nth (1+ (vl-position z list_kt)) list_kt)
      )
      (cond
        (
         (>
           (setq ang
            (angle
              z
              (nth (1+ (vl-position z list_kt))
             list_kt
              )
            )
           )
           (/ pi 2)
         )
         (- (+ (* pi 2) (/ pi 2)) ang)
        )
        (t
         (- (/ pi 2) ang)
        )
      )
          )
          (list
      (distance z (car list_kt))
      (cond
        (
         (>
           (setq ang
            (angle z (car list_kt))
           )
           (/ pi 2)
         )
         (- (+ (* pi 2) (/ pi 2)) ang)
        )
        (t
         (- (/ pi 2) ang)
        )
      )
          )
        )
      )
     list_kt
         )
      )
      (list
        list_kt
        dlina
        (apply '+ (mapcar 'car dlina))
        (vlax-curve-getarea (vlax-ename->vla-object x))
      )
    )
   (vl-remove-if 'listp (mapcar 'cadr (ssnamex pl_nabor)))
       )
     )
  )
)
(defun data-v-file (fnam data / deskr)
  (if
    (setq deskr (open fnam "w"))
     (progn
       (foreach  i data
   (setq j 1)
   (write-line
     "_________________________________________________________________________"
     deskr
   )
   (write-line
     (strcat "N точки"  "\t"           "Координаты"
       "\t"    "\t"       "Меры линий"
       "\t"           "Дирекционные углы"
       "\t"
      )
     deskr
   )
   (write-line
     "_________________________________________________________________________"
     deskr
   )
   (mapcar '(lambda (a b)
        (write-line
          (strcat (itoa j)
            "\t"
            (rtos (car a) 2 2)
            "\t"
            (rtos (cadr a) 2 2)
            "\t"
            "\t"
            (rtos (car b) 2 2)
            "\t"
            "\t"
            (angtos (cadr b) 1 4)
          )
          deskr
        )
        (setq j (1+ j))
      )
     (car i)
     (cadr i)
   )
   (write-line
     "========================================================================="
     deskr
   )
   (write-line
     (strcat "Площадь объекта - " (rtos (nth 2 i) 2 2))
     deskr
   )
   (write-line
     (strcat "Периметр объекта - " (rtos (nth 3 i) 2 2))
     deskr
   )
       )
       (close deskr)
     )
  )
)

Re: Формирование каталогов координат полилиний ???

Привет, народ. Вот пользуюсь кодом, который самый первый здесь, от Лентяй.
Возникла такая проблема: Выделяю земкнутый контур (полилиния), включаю команду PLTOEX, он выдает:
Команда: ; ошибка: неверный тип аргумента: 2D/3D точка: nil

первый раз устранил, проверив все точки и удалив одинаковые точки. А сейчас точки не повторяются (кроме первой и последней).

Подскажите, что может быть.
Autocad 2009 стоит.

Re: Формирование каталогов координат полилиний ???

Костя Шрайнер пишет:

А сейчас точки не повторяются (кроме первой и последней).

Так ты замкни не повторением конечной в начальной, а параметр Замкнуто - Да

(изменено: Костя Шрайнер, 12 апреля 2010г. 18:24:58)

Re: Формирование каталогов координат полилиний ???

Замкнутый контур не обязателен... Можно же и просто линии экспортировать...

Re: Формирование каталогов координат полилиний ???

все уже давно решено кому интересно могу скинуть на мыло заявки принимаются на evgeniy_kirov@rambler.ru