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

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

Вставка блока на концы полилиний перпендикулярно им

Ответ
Поиск в этой теме
Непрочитано 10.12.2014, 11:02 #1
Вставка блока на концы полилиний перпендикулярно им
Karloson1
 
Регистрация: 17.12.2013
Сообщений: 13

День добрый всем...
Помогите пожалуйста, не могу разобраться пробовал макрокомандами но не то.
грубо говоря есть 100 полилиний, на концы каждой надо вставить блок типа штришка под 90 гр. к линии чтоб получилось как то так |-----|.
Как проще и вообще возможно ли, либо все ручками делать.
Заранее спасибо...
Просмотров: 4424
 
Непрочитано 10.12.2014, 12:19
#2
roaa

ОПС
 
Регистрация: 29.03.2012
Kazakhstan
Сообщений: 128


Макрокомандой это не сделать. А так задача очень даже простая. Вот похожая программа:
Код:
[Выделить все]
 
; Автоматически вставить в вершины полилинии одинаковые блоки
(defun c:ins2pline (/                      adoc
                    space                  blk
                    ent                    ins
                    coords                 _kpblc-conv-list-to-3dpoints
                    _kpblc-conv-ent-pline-vertex-to-wcs
                    )

  (defun _kpblc-conv-list-to-3dpoints (lst / res)
                                      ;|
*    Функция конвертации списка чисел в список 3-мерных точек.
*    Параметры вызова:
*	lst	список чисел
*    Примеры вызова:
(_kpblc-conv-list-to-3dpoints '(1 2 3 4 5 6)) ;-> ((1 2 3) (4 5 6))
(_kpblc-conv-list-to-3dpoints '(1 2 3 4 5))   ;-> ((1 2 3) (4 5 0.))
|;
    (cond
      ((not lst)
       nil
       )
      (t
       (setq res (cons (list (car lst)
                             (if (cadr lst)
                               (cadr lst)
                               0.
                               ) ;_ end of if
                             (if (caddr lst)
                               (caddr lst)
                               0.
                               ) ;_ end of if
                             ) ;_ end of list
                       (_kpblc-conv-list-to-3dpoints (cdddr lst))
                       ) ;_ end of cons
             ) ;_ end of setq
       )
      ) ;_ end of cond
    res
    ) ;_ end of defun

  (defun _kpblc-conv-ent-pline-vertex-to-wcs (ent / elevation normal)
                                             ;|
*    Функция получения координат легкой полилинии (LWPOLYLINE) в WCS. Возвращает
* список 3Д-точек
*    Автор: BOZ (http://www.autocad.ru/cgi-bin/f1/board.cgi?t=26461HC)
*    Оригинальный код:
(defun lwpoly_vert (lwpoly / plinee elev vnv)
  (setq	plinee (entget lwpoly)
	elev   (cdr (assoc 38 plinee))
	vnv    (cdr (assoc 210 plinee))
	) ;_ end of setq
  (mapcar
    (function (lambda (x) (trans (list (cadr x) (caddr x) elev) vnv 0)))
    (vl-remove-if-not (function (lambda (x) (= (car x) 10))) plinee)
    ) ;_ end of mapcar
  ) ;_ end of defun
*    Параметры вызова:
*	ent	ename-указатель на LWPOLYLINE (контроля не производится)
*    Примеры вызова:
(_kpblc-conv-ent-pline-vertex-to-wcs (car (entsel)))
|;
    (setq elevation (cdr (assoc 38 (entget ent)))
          normal    (cdr (assoc 210 (entget ent)))
          ) ;_ end of setq
    (if (not elevation)
      (setq elevation 0.)
      ) ;_ end of if
    (mapcar '(lambda (x) (trans (list (cadr x) (caddr x) elevation) normal 0))
            (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget ent))
            ) ;_ end of mapcar
    ) ;_ end of defun

  (vl-load-com)
  (if
    (and
      (not (vl-catch-all-error-p
             (vl-catch-all-apply
               '(lambda ()
                  (setq ent (car (entsel "\nУкажите полилинию <Отмена> : ")))
                  ) ;_ end of lambda
               ) ;_ end of vl-catch-all-apply
             ) ;_ end of vl-catch-all-error-p
           ) ;_ end of not
      ent
      (wcmatch (strcase (cdr (assoc 0 (entget ent)))) "*POLYLINE")
      (not
        (vl-catch-all-error-p
          (vl-catch-all-apply
            '(lambda () (setq blk (car (entsel "\nА теперь блок <Отмена> : "))))
            ) ;_ end of vl-catch-all-apply
          ) ;_ end of vl-catch-all-error-p
        ) ;_ end of not
      blk
      (wcmatch (strcase (cdr (assoc 0 (entget blk)))) "*INSERT")
      ) ;_ end of and
     (progn
       (setq space  (vla-objectidtoobject
                      (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
                      (vla-get-ownerid (vlax-ename->vla-object ent))
                      ) ;_ end of vla-ObjectIDToObject
             blk    (cond
                      ((vlax-property-available-p
                         (setq blk (vlax-ename->vla-object blk))
                         'effectivename
                         ) ;_ end of vlax-property-available-p
                       (vla-get-effectivename blk)
                       )
                      (t (vla-get-name blk))
                      ) ;_ end of cond
             coords (cond
                      ((= (strcase (cdr (assoc 0 (entget ent)))) "LWPOLYLINE")
                       (_kpblc-conv-ent-pline-vertex-to-wcs ent)
                       )
                      (t
                       (_kpblc-conv-list-to-3dpoints
                         (vlax-safearray->list
                           (vlax-variant-value
                             (vla-get-coordinates (vlax-ename->vla-object ent))
                             ) ;_ end of vlax-variant-value
                           ) ;_ end of vlax-safearray->list
                         ) ;_ end of _kpblc-conv-list-to-3dpoints
                       )
                      ) ;_ end of cond
             ) ;_ end of setq
       (vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
       (foreach pt coords
         (if
           (vl-catch-all-error-p
             (vl-catch-all-apply
               (function
                 (lambda ()
                   (setq ins (vla-insertblock
                               space
                               (vlax-3d-point pt)
                               blk
                               1.
                               1.
                               1.
                               0.
                               ) ;_ end of vla-insertblock
                         ) ;_ end of setq
                   ) ;_ end of lambda
                 ) ;_ end of function
               ) ;_ end of vl-catch-all-apply
             ) ;_ end of vl-catch-all-error-p
            (vl-catch-all-apply '(lambda () (vla-erase ins)))
            ) ;_ end of if
         ) ;_ end of foreach
       (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
       ) ;_ end of progn
     ) ;_ end of if
  (princ)
  ) ;_ end of defun

Последний раз редактировалось roaa, 10.12.2014 в 12:28.
roaa вне форума  
 
Автор темы   Непрочитано 10.12.2014, 18:18
#3
Karloson1


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


Большое спасибо. Но не совсем то.
1 она не ставит блок под 90 градусов к линии (линия может быть отрисована как угодно).
2 если линия содержит более 2 точек она ставит блок на каждую точку. (а надо только на начало и конец)
Karloson1 вне форума  
 
Непрочитано 10.12.2014, 20:04
#4
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


с такой постановкой вопроса готовим 10 у.е. и удаляемся в поиск исполнителей...
gomer вне форума  
 
Непрочитано 10.12.2014, 20:13
#5
roaa

ОПС
 
Регистрация: 29.03.2012
Kazakhstan
Сообщений: 128




Цитата:
Сообщение от Karloson1 Посмотреть сообщение
Большое спасибо. Но не совсем то.
1 она не ставит блок под 90 градусов к линии (линия может быть отрисована как угодно).
2 если линия содержит более 2 точек она ставит блок на каждую точку. (а надо только на начало и конец)
Программа похожая, но никто же не говорит...вот пользуйся. Переделайте под свои запросы, задействуйте голову.
roaa вне форума  
 
Непрочитано 10.12.2014, 20:19
#6
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от roaa Посмотреть сообщение
Программа похожая, но никто же не говорит...вот пользуйся
даже и близко не. ты что производные находить не умеешь?
gomer вне форума  
 
Непрочитано 10.12.2014, 22:59
#7
roaa

ОПС
 
Регистрация: 29.03.2012
Kazakhstan
Сообщений: 128


Цитата:
Сообщение от gomer Посмотреть сообщение
даже и близко не. ты что производные находить не умеешь?
Я так понимаю "строю, ломаю" предполагает тыканье. Какой не был специалист правила этикета ими и остаются.
Производные изучал лет надцать, так что и не помню. В решении этой задачки можно обойтись и без них.
Может, с ними и легче, но я на профи по программированию и не претендую. Это так, для зарядки ума
roaa вне форума  
 
Непрочитано 11.12.2014, 01:28
#8
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от roaa Посмотреть сообщение
Какой не был специалист правила этикета ими и остаются.
О местном этикете я наслышан... Но в этом разделе существуют негласные правила, возможно даже не я их придумал.
1. Здесь обсуждаются вопросы и приемы программирования.
2. Попытки получить программу на халяву пресекаются путем отсыла в разделы поиск исполнителей и Автокад (если туго с финансами), причем качество программы во втором разделе не гарантируется.
3. Написание программы "под ключ" - дело добровольное и лежит на совести "добродетеля". Но нужно учитывать количество "голодных" конкурентов.
4. Попытки подсунуть заказчику куклу (прецеденты были, к сожалению мошенник так и не был вычислен) будут караться, надеюсь, баном.

Цитата:
Сообщение от roaa Посмотреть сообщение
я на профи по программированию и не претендую.
а материал знать должен, иначе какой из тебя программист, да даже инженер. Я ж не просто так про производные намекнул. а ты куклу запулил и типа крут.
vlax-curve-getFirstDeriv - вот от чего надо отталкиваться, а не то, что ты понаписал.
gomer вне форума  
 
Непрочитано 11.12.2014, 15:07
#9
Linkor

что хочу, то и делаю
 
Регистрация: 30.06.2014
Сообщений: 119


У меня есть программа для вставки блоков по полилинии, но в конце полилинии блок будет вставляться перпендикулярно, только если последняя часть не является дугой
Linkor вне форума  
 
Непрочитано 12.12.2014, 18:53
#10
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


Цитата:
Сообщение от gomer Посмотреть сообщение
2. Попытки получить программу на халяву пресекаются путем отсыла в разделы поиск исполнителей и Автокад (если туго с финансами),
Я думал, что раздел Автокад предназначен для обсуждения решений, основанных на базовом функционале без привлечения программирования.
gomer, может, я туговат, но что есть "кукла"?
skkkk вне форума  
 
Непрочитано 14.12.2014, 17:42
#11
roaa

ОПС
 
Регистрация: 29.03.2012
Kazakhstan
Сообщений: 128


gomer! Умерь пыл. Я понимаю, что это твоя работа, но...
roaa вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Вставка блока на концы полилиний перпендикулярно им

Реклама i
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какой язык перспективен для инженера-конструктора с условием The_Mercy_Seat Программирование 705 17.03.2021 14:19
AutoCAD 2014. При работе с командой "trim" обрезка вписанной окружности и полилиний, обрезанные концы полилиний и дуги не совпадают. Valery Brelovsky AutoCAD 4 21.02.2014 12:27
Проблема с базовой точкой блока и вхождением блока в DXF nogaems Программирование 5 29.08.2013 15:46
Вставка блока с размером линии nolte Программирование 3 19.05.2013 11:47