Как объединить _DIVIDE и _BREAK AT POINT
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как объединить _DIVIDE и _BREAK AT POINT

Как объединить _DIVIDE и _BREAK AT POINT

Ответ
Поиск в этой теме
Непрочитано 31.05.2024, 21:03 #1
Как объединить _DIVIDE и _BREAK AT POINT
Ingpro
 
Регистрация: 11.07.2022
Сообщений: 775

Я пытаюсь объединить две команды, чтобы поделить объект и разбить по точкам
Код:
[Выделить все]
  (defun c:div-br-point ( )
 (setvar 'osmode 191) 
 (command "_DIVIDE")
 (prompt "\nЧисло сегментов: ")
 (command "_break")

 (setvar 'osmode 183)
  (princ)
)
Код выполняет команду _DIVIDE, но пишет в ком. строке:
Команда: DIV-BR-POINT
Число сегментов:
*Неверный выбор*
Требуется один объект.
; ошибка: Функция отменена
Выберите объект для деления:
Число сегментов или [Блок]: 3

на команду _break нет реакции...

Возможно ли в лисп установить PTYPE Х в абс.ед. 50

Миниатюры
Нажмите на изображение для увеличения
Название: Image 3.png
Просмотров: 34
Размер:	18.8 Кб
ID:	263278  Нажмите на изображение для увеличения
Название: Image 4.png
Просмотров: 31
Размер:	26.6 Кб
ID:	263279  


Последний раз редактировалось Ingpro, 02.06.2024 в 14:33.
Просмотров: 2276
 
Непрочитано 31.05.2024, 21:18
#2
Кулик Алексей aka kpblc
Moderator

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


Так ты сначала запроси все параметры, а потом их уже подставляй в команду.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 31.05.2024, 21:19
#3
Ingpro


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Так ты сначала запроси все параметры
А какие параметры, плз...
Ingpro вне форума  
 
Непрочитано 31.05.2024, 21:21
#4
Кулик Алексей aka kpblc
Moderator

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


(setq ent (car (entsel "\nПримитив : ")))
(setq range (getint "\nКоличество сегментов : "))
(vl-cmdf "_.divide" ent range "")

Без проверок, тестов и прочая. Тупо в качестве идеи
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 31.05.2024, 21:32
#5
Ingpro


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
(setq ent (car (entsel "\nПримитив : ")))
(setq range (getint "\nКоличество сегментов : "))
(vl-cmdf "_.divide" ent range "")
Спасибо, а как дальше разорвать объект по всем точкам?
Код:
[Выделить все]
  (defun c:div-br-point ( )
(vl-load-com)
 (setvar 'osmode 191) 
(setq ent (car (entsel "\nПримитив : ")))
(setq range (getint "\nКоличество сегментов : "))
(vl-cmdf "_.divide" ent range "")

 (setvar 'osmode 183)
  (princ)
)

Последний раз редактировалось Ingpro, 31.05.2024 в 22:03.
Ingpro вне форума  
 
Автор темы   Непрочитано 01.06.2024, 09:34
#6
Ingpro


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


Цитата:
Сообщение от Ingpro Посмотреть сообщение
Возможно ли в лисп установить PTYPE Х в абс.ед. 50
В начале кода можно установить значения сист. переменных для точек
Код:
[Выделить все]
 (setvar "PDMODE" 3)
(setvar "PDSIZE" 50)
в конце кода, после разбиения на части между точками, вернуть в нач. значения
Код:
[Выделить все]
 (setvar "PDMODE" 0)
(setvar "PDSIZE" 0)
Ingpro вне форума  
 
Непрочитано 03.06.2024, 07:33
#7
name02


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


Цитата:
Сообщение от Ingpro Посмотреть сообщение
В начале кода можно установить значения сист. переменных для точек
Лучше все-таки перед изменением системных переменных запоминать их действующие значения, а в конце работы программы восстанавливать их - см. тут.
Так повысится применимость твоей программы для разных пользователей - например, те же объектные привязки - у тебя одни установлены, а другой человек с другим набором привязок привык работать. И каждый раз после выполнения твоей программы они у него будут сбиваться - это очень раздражает.
name02 вне форума  
 
Автор темы   Непрочитано 03.06.2024, 09:20
#8
Ingpro


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


Цитата:
Сообщение от name02 Посмотреть сообщение
Так повысится применимость твоей программы для разных пользователей
Программы то пока нет... Я думаю, можно ли использовать команду BREAK, чтобы разрезать объект на части по точкам деления...
Команда BREAK предлагает указать точки разрыва, а нужно, чтобы разделение произошло сразу по всем точкам.
Или нужно применить другую команду?
Ingpro вне форума  
 
Непрочитано 03.06.2024, 09:38
#9
name02


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


Посмотри тут https://www.theswamp.org/index.php?topic=19874.0
Там делается то что тебе нужно, но координаты берутся из точечных объектов - переделать недолго
name02 вне форума  
 
Автор темы   Непрочитано 03.06.2024, 09:54
#10
Ingpro


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


Цитата:
Сообщение от name02 Посмотреть сообщение
Посмотри тут https://www.theswamp.org/index.php?topic=19874.0
Там делается то что тебе нужно, но координаты берутся из точечных объектов - переделать недолго
Спасибо за ссылку...
Мне бы хотелось не указывать точки, а после команды DIVIDE перейти к разделению по этим точкам... Это возможно?
Код работает с дугами, но с окружностями нет: "Дуга должна быть меньше 360 градусов"

Последний раз редактировалось Ingpro, 04.06.2024 в 09:47.
Ingpro вне форума  
 
Непрочитано 03.06.2024, 10:47
#11
name02


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


Переделал, тот, что по моей ссылке - работает
Код:
[Выделить все]
 (defun c:test (/ pline1 count pt PtList)
  (setq	pline1 (car (entsel "\nPick Polyline:"))
	count  0
	pt     (list)
  ) ;_ end of setq

  (initget "Закончить")
  (while (/= pt "Закончить")
    (setq pt (getpoint "\nУкажите точку [Закончить]:<Закончить>"))
    (cond
      ((null pt) (setq pt "Закончить"))
      (T (setq PtList (append PtList (list pt))))
    ) ;_ end of while
  ) ;_ end of while

  (setq	count 0
	DistList (list)
  ) ;_ end of setq

  ;; sort the points so we won't try to break the NEW pline that is created after a successful break
  (repeat (length PtList)
    (setq DistList (append DistList
			   (list
			     (vlax-curve-GetDistAtPoint
			       Pline1
			       (vlax-curve-getClosestPointTo Pline1 (nth count PtList))
			     ) ;_ end of vlax-curve-GetDistAtPoint
			   ) ;_ end of list
		   ) ;_ end of append
    ) ;_ end of setq
    (setq count (+ 1 count))
  ) ;_ end of repeat

  (mapcar '(lambda (x)
	     (setq breakPt (nth x PtList))
	     (command "_break" pline1 breakpt "@")
	   ) ;_ end of lambda
	  (vl-sort-i DistList '>)
  ) ;_ end of mapcar

  (princ)


) ;_ end of defun
name02 вне форума  
 
Автор темы   Непрочитано 03.06.2024, 11:19
#12
Ingpro


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


Цитата:
Сообщение от name02 Посмотреть сообщение
Переделал, тот, что по моей ссылке - работает
Спасибо, но что он делает? выделяю ПЛ - закончить? и ничего... После загрузки этого кода изменяются параметры чертежа
пропадает контекстное меню и на ПКМ идет повтор последней команды, причем в Параметрах на ПКМ установлено контекстное меню???
Возможно ли просто объединить DIVIDE и код по ссылке?

Последний раз редактировалось Ingpro, 03.06.2024 в 11:32.
Ingpro вне форума  
 
Непрочитано 03.06.2024, 11:22
#13
name02


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


После выделения полилинии надо указывать точки в которых надо полилинию разделять
name02 вне форума  
 
Автор темы   Непрочитано 03.06.2024, 11:38
#14
Ingpro


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


Цитата:
Сообщение от name02 Посмотреть сообщение
После выделения полилинии надо указывать точки в которых надо полилинию разделять
Указываю - не делит... В коде breakatPt точки разделения можно указать рамкой...
А что с контекстным меню происходит?

Последний раз редактировалось Ingpro, 04.06.2024 в 09:48.
Ingpro вне форума  
 
Непрочитано 03.06.2024, 11:41
#15
name02


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


Цитата:
Сообщение от Ingpro Посмотреть сообщение
А что с контекстным меню происходит?
не знаю - я его не вижу, ты даже не описал что с ним не так...
name02 вне форума  
 
Автор темы   Непрочитано 03.06.2024, 11:49
#16
Ingpro


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


Цитата:
Сообщение от name02 Посмотреть сообщение
не знаю - я его не вижу, ты даже не описал что с ним не так...
Вот именно меню нет, вместо этого на ПКМ повтор последней команды... У меня повтор - по пробелу...
В других файлах, где не загружен ваш код все нормально.

Последний раз редактировалось Ingpro, 04.06.2024 в 09:49.
Ingpro вне форума  
 
Непрочитано 03.06.2024, 12:18
#17
name02


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


Что у тебя с меню - не понял. Программа работает так:
1 Запрос на выбор линии
2 Запрос на указание точек разрыва линии
3 Если вместо указания точки нажать ввод или ПКМ - линия будет разделена (если была указана хотя бы одна точка)
На каком этапе не получается контекстное меню вызвать?
name02 вне форума  
 
Автор темы   Непрочитано 03.06.2024, 12:33
#18
Ingpro


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


Цитата:
Сообщение от name02 Посмотреть сообщение
3 Если вместо указания точки нажать ввод или ПКМ - линия будет разделена (если была указана хотя бы одна точка)
Выбор-ПЛ-точка-пкм-выбор-точка и пошла динамика разрыва опять же с указанием точки, в общем что-то не то...

Последний раз редактировалось Ingpro, 04.06.2024 в 09:49.
Ingpro вне форума  
 
Непрочитано 03.06.2024, 12:41
#19
name02


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


Ты сам код программы смотрел?
1 Выделяешь линию
2 Указываешь точки для разрыва линии
3 Если все нужные точки указаны - жмешь ввод
4 Выбранная в п.1 линия разбивается в точках из п.2
name02 вне форума  
 
Автор темы   Непрочитано 03.06.2024, 12:44
#20
Ingpro


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


Цитата:
Сообщение от Ingpro Посмотреть сообщение
выделять точки по одной неудобно
Всё делаю правильно, но не разбивается линия...

Последний раз редактировалось Ingpro, 04.06.2024 в 09:50.
Ingpro вне форума  
 
Непрочитано 03.06.2024, 12:56
#21
name02


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


https://forums.autodesk.com/t5/visua...761302#M404803
name02 вне форума  
 
Автор темы   Непрочитано 03.06.2024, 13:59
#22
Ingpro


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


Цитата:
Сообщение от name02 Посмотреть сообщение
ttps://forums.autodesk.com/t5/visua...761302#M404803
Близко к моей задаче, но, предположим, я не знаю на какие части по длине мне надо разбить полилинию, но знаю на сколько частей (команда DIVIDE).
Я вызываю команду (назовем div-br-pt), сначала включается команда "поделить", выбираю объект, указываю сколько частей, дальше вопрос:
"Разделить по этим точкам?" - enter. Как-то так...
Ingpro вне форума  
 
Непрочитано 03.06.2024, 15:00
#23
name02


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


Пришлось немного переделать под твою задачу
Оригинальный код - https://lee-mac.com/segmentcurve.html
Код:
[Выделить все]
 ;;-------------------------=={ Segment Curve }==------------------------;;
;;                                                                      ;;
;;  This program enables the user convert every object in a selection   ;;
;;  into a polyline approximating the object using a given number of    ;;
;;  linear segments.                                                    ;;
;;                                                                      ;;
;;  Upon calling the program with 'segs' at the AutoCAD command-line,   ;;
;;  the user is prompted to make a selection of planar curve objects    ;;
;;  (Arcs, Circles, Ellipses, Lines, Splines, or 2D Polylines) and      ;;
;;  then to specify the number of segments for the resulting polyline.  ;;
;;                                                                      ;;
;;  The program will then proceed to create a 2D polyline with          ;;
;;  properties identical to each selected object, approximating the     ;;
;;  selected object using the specified number of linear segments.      ;;
;;                                                                      ;;
;;  If a selected object has a coordinate with non-zero Z-component,    ;;
;;  the resultant polyline will have an elevation equal to the          ;;
;;  Z-component of the first point on the curve.                        ;;
;;----------------------------------------------------------------------;;
;;  Author:  Lee Mac, Copyright © 2011  -  www.lee-mac.com              ;;
;;----------------------------------------------------------------------;;
;;  Version 1.0    -    2011-04-18                                      ;;
;;                                                                      ;;
;;  - First release.                                                    ;;
;;----------------------------------------------------------------------;;
;;  Version 1.1    -    2016-04-24                                      ;;
;;                                                                      ;;
;;  - Program entirely rewritten.                                       ;;
;;----------------------------------------------------------------------;;

(defun c:segs (/ *error* dis ent idx inc lst num pnt sel tmp DistList breakPt count)

  (defun *error* (msg)
    (LM:endundo (LM:acdoc))
    (if	(not (wcmatch (strcase msg t) "*break,*cancel*,*exit*"))
      (princ (strcat "\nError: " msg))
    ) ;_ end of if
    (princ)
  ) ;_ end of defun

  (if
    (not
      (and
	(setq num (getenv "LMac\\segs"))
	(setq num (atoi num))
	(< 0 num)
      ) ;_ end of and
    ) ;_ end of not
     (setenv "LMac\\segs" (itoa (setq num 10)))
  ) ;_ end of if
  (if (setq sel
	     (ssget "_:L+.:S"
		    '(
		      (0 . "ARC,CIRCLE,ELLIPSE,LINE,*POLYLINE,SPLINE")
		      (-4 . "<NOT")
		      (-4 . "<AND")
		      (0 . "POLYLINE")
		      (-4 . "&")
		      (70 . 88)
		      (-4 . "AND>")
		      (-4 . "NOT>")
		     )
	     ) ;_ end of ssget
      ) ;_ end of setq
    (progn
      (initget 6)
      (if (setq	tmp (getint
		      (strcat "\nSpecify number of segments <" (itoa num) ">: ")
		    ) ;_ end of getint
	  ) ;_ end of setq
	(setenv "LMac\\segs" (itoa (setq num tmp)))
      ) ;_ end of if
      (LM:startundo (LM:acdoc))
      (repeat (setq idx (sslength sel))
	(setq ent (ssname sel (setq idx (1- idx)))
	      inc (/ (vlax-curve-getdistatparam ent (vlax-curve-getendparam ent))
		     (float num)
		  ) ;_ end of /
	      dis 0.0
	      lst nil
	) ;_ end of setq
	(repeat	(1+ num)
	  (if (setq pnt (vlax-curve-getpointatdist ent dis))
	    (setq lst (cons (cons 10 (trans pnt 0 ent)) lst))
	  ) ;_ end of if
	  (setq dis (+ dis inc))
	) ;_ end of repeat
	(if (not (equal	(vlax-curve-getendpoint ent)
			(trans (cdar lst) ent 0)
			1e-6
		 ) ;_ end of equal
	    ) ;_ end of not
	  (setq	lst (cons (cons 10 (trans (vlax-curve-getendpoint ent) 0 ent))
			  lst
		    ) ;_ end of cons
	  ) ;_ end of setq
	) ;_ end of if

	;; sort the points so we won't try to break the NEW pline that is created after a successful break
	(setq count 0)
	(repeat	(length lst)
	  (setq	DistList (append DistList
				 (list
				   (vlax-curve-GetDistAtPoint
				     (ssname sel 0)
				     (vlax-curve-getClosestPointTo (ssname sel 0) (cdr (nth count lst)))
				   ) ;_ end of vlax-curve-GetDistAtPoint
				 ) ;_ end of list
			 ) ;_ end of append
	  ) ;_ end of setq
	  (setq count (+ 1 count))
	) ;_ end of repeat



	(mapcar	'(lambda (x)
		   (setq breakPt (cdr (nth x lst)))
		   (command "_break" (ssname sel 0) breakPt "@")
		 ) ;_ end of lambda
		(vl-sort-i DistList '>)
	) ;_ end of mapcar



      ) ;_ end of repeat
      (LM:endundo (LM:acdoc))
    ) ;_ end of progn
  ) ;_ end of if
  (princ)
) ;_ end of defun

;; Default Properties  -  Lee Mac
;; Returns a list of DXF properties for the supplied DXF data,
;; substituting default values for absent DXF groups

(defun LM:defaultprops (enx)
  (mapcar '(lambda (x)
	     (cond ((assoc (car x) enx))
		   (x)
	     ) ;_ end of cond
	   ) ;_ end of lambda
	  '(
	    (006 . "BYLAYER")
	    (008 . "0")
	    (039 . 0.0)
	    (048 . 1.0)
	    (062 . 256)
	    (370 . -1)
	   )
  ) ;_ end of mapcar
) ;_ end of defun

;; Start Undo  -  Lee Mac
;; Opens an Undo Group.

(defun LM:startundo (doc)
  (LM:endundo doc)
  (vla-startundomark doc)
) ;_ end of defun

;; End Undo  -  Lee Mac
;; Closes an Undo Group.

(defun LM:endundo (doc)
  (while (= 8 (logand 8 (getvar 'undoctl)))
    (vla-endundomark doc)
  ) ;_ end of while
) ;_ end of defun

;; Active Document  -  Lee Mac
;; Returns the VLA Active Document Object

(defun LM:acdoc	nil
  (eval	(list 'defun
	      'LM:acdoc
	      'nil
	      (vla-get-activedocument (vlax-get-acad-object))
	) ;_ end of list
  ) ;_ end of eval
  (LM:acdoc)
) ;_ end of defun

;;----------------------------------------------------------------------;;

(vl-load-com)
(princ
  (strcat
    "\n:: SegmentCurve.lsp | Version 1.1 | \\U+00A9 Lee Mac "
    (menucmd "m=$(edtime,0,yyyy)")
    " www.lee-mac.com ::"
    "\n:: Type \"segs\" to Invoke ::"
  ) ;_ end of strcat
) ;_ end of princ
(princ)

;;----------------------------------------------------------------------;;
;;                             End of File                              ;;
;;----------------------------------------------------------------------;;
name02 вне форума  
 
Автор темы   Непрочитано 03.06.2024, 15:31
#24
Ingpro


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


Цитата:
Сообщение от name02 Посмотреть сообщение
Пришлось немного переделать под твою задачу
Оригинальный код - https://lee-mac.com/segmentcurve.html
Спасибо, name02, но не делит?...
Команда: SEGS
Выберите объекты:
Specify number of segments <5>:
VVC: Internal Error
Это в AutoCAD 2015. Проверяю в 2020 - работает!! И с полилиниями и с дугами.
Заменяю command на command-s и всё работает и в AutoCAD 2015. Это VVC: Internal Error
Спасибо большое!

Последний раз редактировалось Ingpro, 04.06.2024 в 09:50.
Ingpro вне форума  
 
Непрочитано 03.06.2024, 15:49
#25
name02


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


Специально скачал с форума выложенный мною код и запустил во вновь открытом документе - все работает
name02 вне форума  
 
Автор темы   Непрочитано 03.06.2024, 15:59
#26
Ingpro


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


Цитата:
Сообщение от name02 Посмотреть сообщение
Специально скачал с форума выложенный мною код и запустил во вновь открытом документе - все работает
Это замена command на command-s и версии AutoCAD.
В 2015 работает с command-s, в 2020 с command и с command-s...

Последний раз редактировалось Ingpro, 04.06.2024 в 09:51.
Ingpro вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как объединить _DIVIDE и _BREAK AT POINT



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не получается объединить все грани сети, находящиеся на одной плоскости lloydst AutoCAD 0 09.04.2021 16:54
Point Name, 3D offset и др. в Autodesk Land Desktop 2007 Re-Maker Вертикальные решения на базе AutoCAD 2 12.08.2014 10:19
C#.NET. Переопределение ручек (Grip Overrule). Do$ .NET 7 20.05.2013 15:22
AutoCAD2010 выдает 82 отчета об ошибке за раз Nusia AutoCAD 22 29.08.2012 16:11
Regen Holon Программирование 28 03.08.2007 15:18