Как объединить _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
Сообщений: 756

Я пытаюсь объединить две команды, чтобы поделить объект и разбить по точкам
Код:
[Выделить все]
  (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
Просмотров: 32
Размер:	18.8 Кб
ID:	263278  Нажмите на изображение для увеличения
Название: Image 4.png
Просмотров: 29
Размер:	26.6 Кб
ID:	263279  


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

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


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


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


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

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


(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
Сообщений: 756


Цитата:
Сообщение от Кулик Алексей 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
Сообщений: 756


Цитата:
Сообщение от 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
Сообщений: 415


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


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


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


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


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


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


Цитата:
Сообщение от 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
Сообщений: 415


Переделал, тот, что по моей ссылке - работает
Код:
[Выделить все]
 (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
Сообщений: 756


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

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


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


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


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


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

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


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


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


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


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

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


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


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


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


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

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


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


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


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


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

Последний раз редактировалось Ingpro, 04.06.2024 в 09:50.
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