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

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

Программный TRIM

Ответ
Поиск в этой теме
Непрочитано 24.08.2010, 11:01 #1
Программный TRIM
Zaghim
 
Регистрация: 01.07.2010
Сообщений: 521

Помоги сделать обрезку объектов программно... Есть нарисованная когда-то труба на чертеже, далее программно рисую другую и врезаюсь в эту трубу. Линию пересечения нужно потримить. Имею все координаты новой трубы, выполняю команду трим в лиспе - указываю точки начала и конца трубы а так же точку ее врезки /\. Затем определяю точки смещения внутрь этой трубы, то, что нужно обрезать и указываю их в команде. В итоге ничего не тримится. Как быть? Может вообще есть другие варианты?
Просмотров: 3572
 
Непрочитано 24.08.2010, 11:19
1 | #2
KennyMckormik


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


Почитай, поможет
http://dwg.ru/pub/12
__________________
Timeo Danaos et dona ferentes :eek:
KennyMckormik вне форума  
 
Автор темы   Непрочитано 24.08.2010, 11:32
#3
Zaghim


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


Как раз думал о таком варианте, спасибо!!!
В общем не совсем то получается. Эта область которая перекрывает линию возможна только замкнутая. Т.е. нельзя сделать такой блок
/\ и что бы он перекрыл линии, идущую снизу. Как быть?

Последний раз редактировалось Zaghim, 24.08.2010 в 12:55.
Zaghim вне форума  
 
Непрочитано 24.08.2010, 16:46
1 | #4
E-degtyarev

Помогаю, кому делать нечего.
 
Регистрация: 27.03.2009
Русская деревня
Сообщений: 394


Я делаю _trim лиспом примерно так:

Код:
[Выделить все]
(vl-cmdf "_rectang" "_none" pt11 "_none" pt12)
  (setq prjam (entlast))
   (vl-cmdf "_trim"  prjam    ""	      "_f"     "_none"	pt13
	   "_none"  pt33     "_none"  pt14     "_none"	pt34
	   "_none"  pt13     ""	      ""
	  )
Может быть неуклюже, но работает.
Пример конечно оторван от жизни, т.е. темы.
Приложи свой лисп, попробую сделать.
E-degtyarev вне форума  
 
Автор темы   Непрочитано 24.08.2010, 17:15
#5
Zaghim


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


Спасибо, чел)))
Сделал свою врезку блоком, отложил от линии пересечения по 2 точки, что бы точно пересекло и через фенс делал трим))) Яху))))
Zaghim вне форума  
 
Непрочитано 24.08.2010, 18:20
#6
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Zaghim, вот такая программа. Работать у тебя не будет, так как внутри тьма специальных функций. Но смысл поймешь. Не надо указывать точки начала и конца "магистрали" - достаточно только точку врезки и направление ответвления. См. как делается надежный программный TRIM. А через "фенс" ненадежно, просто столкнешься позже.
Код:
[Выделить все]
(defun ru-pipe-weld-tee-plan
                             (/
                              ang_draw
                              diam_main
                              diam_tap
                              dia_lst
                              ent
                              ent_point
                              ent_tap_point
                              left_pnt
                              left_pnt_on_mag
                              lst_segm
                              millimeter
                              msg
                              pnt_0
                              pnt_intersect
                              result_check
                              right_pnt
                              right_pnt_on_mag


                             )
  ;;Врезка в магистральс выбором диаметров
  ;; (ru-pipe-weld-tee-plan)
  (ru-app-begin)
  (setq diam_main (ru-conv-millimeter-to-unit
                    (atof (ru-user-read-last-param "MainTeeDia_mm" "200.0")
                    ) ;_ end of atof
                  ) ;_ end of ru-conv-millimeter-to-unit
        diam_tap  (ru-conv-millimeter-to-unit
                    (atof (ru-user-read-last-param "TapTeeDia_mm" "100.0"))
                  ) ;_ end of ru-conv-millimeter-to-unit
  ) ;_ end of setq
  (while (setq dia_lst (ru-dlg-get-two-number
                         "Диаметры врезки"
                         "Магистраль"
                         (ru-conv-unit-to-millimeter diam_main)
                         15
                         1000
                         "Ответвление"
                         (ru-conv-unit-to-millimeter diam_tap)
                         15
                         1000
                         "sanitary\\options\\hvac\pipe\\diam_only_nominal.xml"
                         "sanitary\\options\\hvac\pipe\\diam_only_nominal.xml"
                                           nil
                  "ru_action_dlg_dia_two_select"

                       ) ;_ end of ru-dlg-get-two-number
         ) ;_ end of setq
    (if (< (setq diam_main (car dia_lst)) (setq diam_tap (cadr dia_lst)))
      (ru-msg-alert
        (strcat "\nДиаметр врезки "
                (rtos diam_tap 2 0)
                " не может быть больше диаметра магистрали "
                (rtos diam_main 2 0)
        ) ;_ end of strcat
      ) ;_ end of ru-msg-alert
      (progn
        (setq msg       (strcat "\nМесто врезки диаметром "
                                (rtos diam_tap 2 0)
                                " на краю магистрали диаметром "
                                (rtos diam_main 2 0)
                        ) ;_ end of strcat
              diam_tap  (ru-conv-millimeter-to-unit diam_tap)
              diam_main (ru-conv-millimeter-to-unit diam_main)
        ) ;_ end of setq
        (if (setq ent_point (ru-get-point-on-ent msg))
          (if (setq lst_segm (ru-geom-list-ent-point
                               (setq ent (car ent_point))
                               (setq pnt_0 ;; указанная точка
                                           (cadr ent_point)
                               ) ;_ end of setq
                             ) ;_ end of ru-geom-list-ent-point
              ) ;_ end of setq
            (if (setq result_check
                       (ru-geom-check-weld-geometry
                         diam_main
                         diam_tap
                         pnt_0
                         (car lst_segm)
                         (cadr lst_segm)
                         (ru-get-point-reguired-with-offset "Конец ответвления" pnt_0)
                       ) ;_ end of ru-geom-check-weld-geometry
                ) ;_ end of setq
              (progn
                (setq pnt_intersect    (nth 0 result_check)
                      left_pnt_on_mag  (nth 1 result_check)
                      left_pnt         (nth 2 result_check)
                      right_pnt_on_mag (nth 3 result_check)
                      right_pnt        (nth 4 result_check)
                      ent_tap_point    (nth 5 result_check)
                       ang_draw         (nth 6 result_check)
                ) ;_ end of setq

                (ru-pline-add
                  (list pnt_intersect
                        left_pnt_on_mag
                        left_pnt
                        right_pnt
                        right_pnt_on_mag
                  ) ;_ end of list
                  t
                  0
                  (ru-lw-current)
                  nil
                ) ;_ end of ru-pline-add
                (ru-var-clear-osnap)
                (vl-cmdf "_.TRIM"
                         (entlast)
                         ""
                         (list ent (trans pnt_0 0 1))
                         ""
                ) ;_ end of command
                (ru-var-restore-osnap)
                (ru-pline-add
                  (list
                   (polar pnt_intersect (ru-geom-go-back ang_draw) (* diam_main 0.8))
                    ent_tap_point
                  ) ;_ end of list
                  nil
                  0
                  0
                  "DASHDOT"
                ) ;_ end of ru-pline-add
                (setq *ru_last_end_point*
                       ent_tap_point
                ) ;_ end of setq
                (ru-user-write-last-param
                  "MainTeeDia_mm"
                  (rtos (ru-conv-unit-to-millimeter diam_main))
                ) ;_ end of ru-user-write-last-param
                (ru-user-write-last-param
                  "TapTeeDia_mm"
                  (rtos (ru-conv-unit-to-millimeter diam_tap))
                ) ;_ end of ru-user-write-last-param
              ) ;_ end of progn
            ) ;_ end of if
            (ru-msg-alert
              "\nНе могу определить врезку в указанную линию... "
            ) ;_ end of ru-msg-alert
          ) ;_ end of progn
        ) ;_ end of if
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of while
  (ru-app-end)
  (princ)
) ;_ end of defun
Миниатюры
Нажмите на изображение для увеличения
Название: vrezka.png
Просмотров: 54
Размер:	783 байт
ID:	44166  
ShaggyDoc вне форума  
 
Непрочитано 26.08.2010, 08:30
#7
E-degtyarev

Помогаю, кому делать нечего.
 
Регистрация: 27.03.2009
Русская деревня
Сообщений: 394


Цитата:
А через "фенс" ненадежно, просто столкнешься позже.
ShaggyDoc, а можно пояснить в чем заключается ненадежность?
У нас проблемы пока не возникали.
E-degtyarev вне форума  
 
Непрочитано 26.08.2010, 11:26
#8
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
Сообщение от E-degtyarev Посмотреть сообщение
ShaggyDoc, а можно пояснить в чем заключается ненадежность?
У нас проблемы пока не возникали.
В подобных методах есть несколько ловушек:

1. Объектные привязки, изменяющие точки. Код в #4 это учитывает, отключение привязки предусмотрено. Но для каждой точки, а в реальной программе про это запросто можно забыть.

2. Расчет дополнительных точек. Код в #4 включает пять дополнительных, "неизвестно откуда" взявшихся точек. Конечно, это только кусочек для примера, но точки надо как-то рассчитать. Причем правильно, с учетом конфигурации разрезаемой линии, а она может быть не простой.

3. Влияние зуммирования. Неизвестно, как сработает, если всё за пределами видимости, да в мелком масштабе.

4. Надо пробовать в разных ПСК. Ещё неизвестно, как точки режущей линии вычислены.

Всё это, конечно, преодолимо. Но надо испытывать в разных режимах и не забывать об этом. Еще над проверять случаи, когда имеем дело с полилиниями с заданной не нулевой физической шириной (width).

Обратите внимание - в моем коде задана только одна точка, да ещё в виде не просто точки, а списком (list ent (trans pnt_0 0 1)). "Это Ж-Ж неспроста".
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 26.08.2010, 11:54
#9
Zaghim


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


Все, кроме зума лабуда и решаемо!
У меня вообще не пойми чего рисуется, если экран в другой стороне...косяк автокада...
Zaghim вне форума  
 
Непрочитано 26.08.2010, 13:01
#10
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


Не косяк AutoCAD'a, а косяк пользовательской (то бишь твоей) программы. Это, как говорится, две большие разницы.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Программный TRIM



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Trim функция KIKSa AutoCAD 5 14.02.2010 20:33
Хочу сделать линии, по которым не режет TRIM I.Van AutoCAD 9 03.06.2008 20:30
проблема с arc trim таня AutoCAD 3 05.08.2005 09:50
Массовый TRIM объектов X-DeViL AutoCAD 13 16.09.2004 19:40