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

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

как разбить полилинию на участки, протяженности которых надо извлечь из таблицы Excel

Ответ
Поиск в этой теме
Непрочитано 08.09.2011, 12:34 #1
как разбить полилинию на участки, протяженности которых надо извлечь из таблицы Excel
Алекс777snow
 
Регистрация: 08.09.2011
Сообщений: 8

Уважаемые форумчане поможите!
имеем: полилинию в автокаде и таблицу Excel с колонками A - номер (целое число) и В - протяженность участка в метрах (десятичное число). Каждый участок имеет свою протяженность (от 0,10 м до 27,88 м).
Задача: разбить полилинию на участки с созданием 2-х полей в свойствах полилинии (в эти поля автоматически должны заноситься данные колонок "А" и "В" при построении (разбивке) полилинии). Данных в таблице Excel очень много - 10 000 - 15 000 строк - т.е. должно получиться 10 000 - 15 000 участков разной протяженности. Номера участков идут по порядку - 1,2,3,4,5......10456.
Можно ли решить такую задачу???
Заранее благодарен всем!
Просмотров: 6868
 
Непрочитано 08.09.2011, 12:53
#2
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Что ты подразумеваешь под "полями с свойствах полилинии" - чтоб не было путаницы в терминологии выкладывай примеры как куска файла, так и полилинии.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 08.09.2011, 13:34 данные к задаче
#3
Алекс777snow


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


данные к вышеуказанной задаче
Вложения
Тип файла: rar данные.rar (64.5 Кб, 132 просмотров)
Алекс777snow вне форума  
 
Непрочитано 08.09.2011, 14:13
#4
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Выложите пожалуйста ту полилинию, которые Вы на "рисунке" показываете (в файле другая без расширенных данных - да и слой там другой).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 08.09.2011, 14:25
#5
Алекс777snow


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


это тоже самое, просто цвет линии поменян. Чертеж состоит из 2-х слоев: 1 - "truba" - без дополнительных полей; 2 - "данные_с_полями" - с полями куда планируется в автоматическом режиме переносить данные при разбивке этой полилинии на участки.
Алекс777snow вне форума  
 
Непрочитано 08.09.2011, 14:38
#6
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Это не тоже самое, в приложенном файле нет "полей" - а чтоб сделать такие-же нужно формат смотреть. Но если Вам это не нужно - можете не выкладывать.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 08.09.2011, 15:10
#7
Алекс777snow


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


Дима, тысяча извенений! С моей стороны небольшая оплошность - то что на картинке показано это выполнено в AutoCAD Map 3D 2009 путем импорта таблицы Mapinfo в чертеж. Свойства отображены именно в AutoCAD Map 3D 2009, я не подозревал что в обычном AutoCAD эти свойства не видны. Скажите пожалуйста теперь, моя задача решаема в данном случае?
Алекс777snow вне форума  
 
Непрочитано 08.09.2011, 15:27
#8
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


В связи с вышеизложенным сформулируете ее заново - разбить полилинию на куски можно (и поле длинны там будет по умолчанию) - куда впендюрить номер?
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 09.09.2011, 09:19
#9
Алекс777snow


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


Есть полилиния в автокаде и таблица Excel с колонками A - номер (целое число) и В - протяженность участка в метрах (десятичное число). Каждый участок имеет свою протяженность (от 0,10 м до 27,88 м).

Задача: Надо разбить полилинию на участки различной протяженности с созданием отдельного поля в свойствах полилинии (в это поле автоматически должны заноситься данные из колонки "А" - номера участков. Данных в таблице Excel очень много - 10 000 - 15 000 строк - т.е. должно получиться 10 000 - 15 000 участков разной протяженности. Во вложенных данных - 47 участков (47 строк в таблице Excel). Номера участков идут по порядку - 1,2,3,4,5......47, соответственно полилиния должна разбиваться в таком же порядке. Разбитая на участки полилиния будет экспортироваться в Mapifo через AutoCAD Map 3D 2009, так как через AutoCAD Map 3D 2009 могут экспортироваться не только графические объекты но и их свойства - геометрия и дополнительные поля. "Куда впендюрить номер"??? - каким то образом создать дополнительное поле, например в общих свойствах, если не получиться создать поле, тогда попытаться впендюрить в гиперсылку - это поле тоже экспортируется.
Алекс777snow вне форума  
 
Непрочитано 09.09.2011, 10:05
#10
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


В полилинии надеюсь дуговых секторов нет?
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 09.09.2011, 10:14
#11
Алекс777snow


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


нет, дуговых нет, полилиния проведена по точкам
Алекс777snow вне форума  
 
Непрочитано 09.09.2011, 12:38
#12
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Ну чтож, с тебя пузырь чтоль? Детские ошибки (типа выбрал не полилинию, или формат файла - должно быть как в примере - начиная с второй строки 2 столбца (a,b)) не проверяет, так что будь бдителен:
Код:
[Выделить все]
 (vl-load-com)
(defun cod (cd obj) ; возращает код cd примитива obj.
  (if (and obj (= (type obj) 'ename))
      (cdr (assoc cd (entget obj)))
));end of cod
(defun long-prop (obj lst-p);"последовательные" свойства vla-объекта
  (if lst-p
      (long-prop	(if (listp (car lst-p))
                            (apply 'vlax-get-property (cons obj (car lst-p)))
                            (vlax-get-property obj (car lst-p)))
                        (cdr lst-p))
      obj))
(defun pln (lst c); создает полилинию по списку вершин lst, c - nil/T - разомкн/замкнт или '(с слой цвет).
  (entmakex (append
             (list (cons 0 "LWPOLYLINE")(cons 100 "AcDbEntity")(cons 100 "AcDbPolyline") (cons 90 (length lst)))
             (if (= (type c) 'list)
                 (vl-remove nil (list
                                 (if (car c) (cons 70 1) (cons 70 0))
                                 (if (cadr c) (cons 8 (cadr c)))
                                 (if (caddr c) (cons 62 (caddr c)))
                                 ));end of list & vl-remove
                 (list (if c (cons 70 1) (cons 70 0)))
                 );end of if
             (mapcar '(lambda (x) (cons 10 x)) lst)
             ));end of apend & entmakex
  );end of pln 
(defun pltolist (obj); возращает список координат вершин полилинии
  (if (= (cod 0 obj) "LWPOLYLINE")
      (mapcar '(lambda (x) (trans (append (cdr x) (list (cod 38 obj))) (cod 210 obj) 0))
              (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget obj)))))    
(defun split-lst-pt (lst len);car/cdr - 2 списка точек - до/после расстояния len.
  ((lambda (frec)
     ((lambda (r)
        (cons (reverse (cdr r)) (car r)))
      (reverse (frec lst len))))
   (lambda (lst len);frec
     ((lambda (dist)
        (if (>= dist len)
            ((lambda (pt)
               (cons (car lst) (cons pt (list (cons pt (cdr lst))))))
             (polar (car lst)
                    (angle (car lst) (cadr lst))
                    len))
            (cons (car lst) (frec (cdr lst) (- len dist)))))
      (distance (car lst) (cadr lst))))))
(defun make-sub-pl (pl lst-len); создает полилинии с гиперссылками вдоль "определяющей"
  ;lst-len '((имя длинна)...); frec рекурсия развернута - иначе максимум 10 тыс.
  ((lambda (frec) (frec (pltolist pl) lst-len))
   (lambda (lst lst-len)
     (while lst-len
            ((lambda (split-pl str)
               (vla-add (vla-get-hyperlinks (vlax-ename->vla-object (pln (car split-pl) nil)))
                        str str)
               ;(frec (cdr split-pl) (cdr lst-len)) - РАЗВЕРНУТО
               (SETQ lst (cdr split-pl)
                     lst-len (cdr lst-len)))
             (split-lst-pt lst (cadar lst-len))
             (if (numberp (caar lst-len))
                 (rtos (caar lst-len))
                 (caar lst-len)))))))        

(defun get-excel-data (path)
  ((lambda (excel)
     (vlax-invoke-method (long-prop excel '("Workbooks")) 'Open path)
     ((lambda (ret)
        (vlax-invoke-method excel 'Quit)
        (vlax-release-object excel)
        ret)
      (mapcar '(lambda (lst) (mapcar 'vlax-variant-value lst))
              (vlax-safearray->list
               (vlax-variant-value
                (long-prop excel '("Worksheets" ("Item" 1) "UsedRange" "Value")))))))   
   (vlax-create-object "excel.application")))
(defun c:test()
  ((lambda (pl lst-len)
     (if (<(vla-get-length (vlax-ename->vla-object pl))
           (apply '+ (mapcar 'cadr lst-len)))
         " Полилиния короче суммарной длинны данных"
         ((lambda (adoc)
            (vla-startundomark adoc)
            (make-sub-pl pl lst-len)
            (vla-endundomark adoc)
            " Процесс успешно завершен")
          (vla-get-activedocument(vlax-get-acad-object)))))
   (car (entsel "\Выберите исходную полилинию "))
   (cdr (get-excel-data(getfiled "Выберите файл с данными" "" "" 0)))))
запускать командой test
p.s. Внес 2 исправления ...
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 09.09.2011 в 15:20.
Дима_ вне форума  
 
Автор темы   Непрочитано 09.09.2011, 14:01
#13
Алекс777snow


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


попробую сейчас, а то до этого ничего не получалось

Большое спаибо!!!! Получилось, но не все что хотел - номера не переходят при экспорте, т.е. в автокаде все как надо выходит - все с номерами участков, а при экспорте получается вот что "http://forum.dwg.ru/showthread.php?t=72414" - т.е. переходит присто текст гиперссылки. Номер куда то надо затащить. Дима выручай.

Последний раз редактировалось Алекс777snow, 09.09.2011 в 14:48.
Алекс777snow вне форума  
 
Непрочитано 09.09.2011, 15:21
#14
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Исправил, пробуй.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 09.09.2011, 15:53
#15
Алекс777snow


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


Получилось!!! С меня пиво в питере!!! Огромное спасибо Дмитрий! Отличный сайт и отличные отзывчивые люди! Всем спасибо.
Алекс777snow вне форума  
 
Непрочитано 09.09.2011, 15:57
#16
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Пиво не пью, можно квас.Offtop: ну или более крепкое
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 09.09.2011 в 16:06.
Дима_ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > как разбить полилинию на участки, протяженности которых надо извлечь из таблицы Excel



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа для создания таблиц AutoCAD из Excel МишаИнженер Готовые программы 4 05.08.2011 18:32
как с помощью vba начертить линию vasyavip Программирование 77 09.10.2008 23:17