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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Изменить вес выбранного элемента блока

Изменить вес выбранного элемента блока

Ответ
Поиск в этой теме
Непрочитано 24.05.2022, 20:12 #1
Изменить вес выбранного элемента блока
olga87
 
Регистрация: 28.05.2007
Сообщений: 207

Здравствуйте Уважаемые программисты для AutoCAD!

Подскажите пожалуйста, как исправить код ниже, чтобы можно было выбрать нужный вес, а затем выделить элемент (элементы) внутри блока, которым этот вес будет назначен в явном виде.

Код:
[Выделить все]
(defun LM:unique  (l) (if l (cons (car l) (LM:Unique (vl-remove (car l) (cdr l))))))

(defun BB:setWghtBlock  (nam / blc blk)
  (setq blc (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))))
  (setq blk (vla-item blc nam))
  
  (initget "Weight")
  (setq typW (getkword "Выберите нужный вес (0.3/0.5/0.7): "))
  (if (null typW)
  (prompt "\nНе задан вес.")
  )
  
  (vlax-for x  blk (vlax-put-property x 'lineweight typW))
)

(vl-load-com)

(defun c:bf ( / c_doc sel cnt obj col)
  (setq c_doc (vla-get-activedocument (vlax-get-acad-object)))
  (princ "\nВыберите блоки: ")
  (setq sel (ssget '((0 . "INSERT"))))
  (cond (sel
          (repeat (setq cnt (sslength sel))
            (setq obj (vlax-ename->vla-object (ssname sel (setq cnt (1- cnt)))))
            (cond ( (= :vlax-true (vlax-get-property obj 'isdynamicblock))
                    (setq col (cons (vla-get-effectivename obj) col)
                          col (cons (vla-get-name obj) col)
                    )
                  )
                  (t  (setq col (cons (vla-get-effectiveName obx) col)))
            );end_cond
          );end_repeat
          (setq col (LM:unique col))
          (foreach x col (BB:setWghtBlock x))
        )
        ( (princ "\nНичего не выбрано"))
  );end_cond
  (vla-regen c_doc acActiveViewport)
  (princ)
)


Заранее спасибо!

----- добавлено через ~13 ч. -----
Ниже код работает, НО вес применяется для всех элементов блока.
Помогите пожалуйста исправить код ниже, чтобы вес применялся только к выбранному элементу блока.

Код:
[Выделить все]
(defun LM:unique  (l) (if l (cons (car l) (LM:Unique (vl-remove (car l) (cdr l))))))

(defun BB:setBlockacLnWt (nam / blc blk)
  (setq blc (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))))
  (setq blk (vla-item blc nam))

  	(cond 
        ((= ans "0")
         (vlax-for x blk (vlax-put-property x 'lineweight acLnWt000))
        )
        ((= ans "0.09")
         (vlax-for x blk (vlax-put-property x 'lineweight acLnWt009))
        )
		((= ans "0.2")
         (vlax-for x blk (vlax-put-property x 'lineweight acLnWt020))
        )
		((= ans "0.3")
         (vlax-for x blk (vlax-put-property x 'lineweight acLnWt030))
        )
		((= ans "0.35")
         (vlax-for x blk (vlax-put-property x 'lineweight acLnWt035))
        )
		((= ans "0.4")
         (vlax-for x blk (vlax-put-property x 'lineweight acLnWt040))
        )
		((= ans "0.5")
         (vlax-for x blk (vlax-put-property x 'lineweight acLnWt050))
        )
		((= ans "0.6")
         (vlax-for x blk (vlax-put-property x 'lineweight acLnWt060))
        )
		((= ans "0.7")
         (vlax-for x blk (vlax-put-property x 'lineweight acLnWt070))
        )
		((= ans "0.8")
         (vlax-for x blk (vlax-put-property x 'lineweight acLnWt080))
        )
		((= ans "1")
         (vlax-for x blk (vlax-put-property x 'lineweight acLnWt100))
        )
		((= ans "1.2")
         (vlax-for x blk (vlax-put-property x 'lineweight acLnWt120))
        )
		((= ans "1.4")
         (vlax-for x blk (vlax-put-property x 'lineweight acLnWt140))
        )
		((= ans "2")
         (vlax-for x blk (vlax-put-property x 'lineweight acLnWt200))
        )
    )
)

(vl-load-com)

(defun c:ww ( / ans c_doc sel cnt obj col)
  (setq c_doc (vla-get-activedocument (vlax-get-acad-object)))
  
  (initget 1 "0 0.09 0.2 0.3 0.35 0.4 0.5 0.6 0.7 0.8 1 1.2 1.4 2")
  (setq ans (getkword "\nКакой нужен вес: [0/0.09/0.2/0.3/0.35/0.4/0.5/0.6/0.7/0.8/1/1.2/1.4/2]"))
  (if (null ans)
  (prompt "\nНе задан вес.")
  )
  
  (princ "\nВыберите блоки: ")
  (setq sel (ssget '((0 . "INSERT"))))
  (cond (sel
          (repeat (setq cnt (sslength sel))
            (setq obj (vlax-ename->vla-object (ssname sel (setq cnt (1- cnt)))))
            (cond (
                    (setq col (cons (vla-get-effectivename obj) col)
                          col (cons (vla-get-name obj) col)
                    )
                  )
                  (t  (setq col (cons (vla-get-effectiveName obx) col)))
            );end_cond
          );end_repeat
          (setq col (LM:unique col))
          (foreach x col (BB:setBlockacLnWt x))
        )
        ( (princ "\nНичего не выбрано"))
  );end_cond
  (vla-regen c_doc acActiveViewport)
  (princ)
)

Последний раз редактировалось olga87, 25.05.2022 в 08:46.
Просмотров: 2543
 
Непрочитано 26.05.2022, 11:45
#2
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


olga87,
ну а что тут такого?
1. выбрать статические объекты блока напрямую можно nentsel-ом и создать список ename-ов.
2. выделять выбранные статические объекты в списке - костылями.
3. поменять вес для каждого ename в созданном списке.
koMon вне форума  
 
Автор темы   Непрочитано 26.05.2022, 14:59
#3
olga87


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


Спасибо!

Посмотрите код ниже пожалуйста, верно?

Код:
[Выделить все]
(setq doc (vla-get-activedocument (vlax-get-acad-object)))
 (while (setq enm (car (nentsel)))
   (setq obj (vlax-ename->vla-object enm))
 )

(foreach obj 
(vlax-put-property obj 'lineweight acLnWt200)
)

Последний раз редактировалось olga87, 26.05.2022 в 15:33.
olga87 вне форума  
 
Непрочитано 26.05.2022, 15:57
1 | #4
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


неверно...
как заготовка
Код:
[Выделить все]
 
(setq selecting_stopped nil)
(setq ename_list nil)
(setq selected_enames_boundings nil)
(while (not selecting_stopped)
	(setq nentsel_data (vl-catch-all-apply 'nentsel (list "\nВыберите приитивы внутри блока: ")))
	(cond
		(
			(vl-catch-all-error-p nentsel_data)
				(setq selecting_stopped t
					  exit_value 0
				)
		)
		(
			(and
				 (null nentsel_data)
				 (= 52 (getvar 'errno))
			)
				(setq selecting_stopped t
					  exit_value 1
				)
		)
		(
			(and
				 (null nentsel_data)
				 (= 7 (getvar 'errno))
			)
				(if selected_enames_boundings (grvecs selected_enames_boundings))
		)
		(
			t
				(if (and (equal 'ename (type (car (last nentsel_data))))
						 (= "INSERT" (cdr (assoc 0 (entget (car (last nentsel_data))))))
					)
						(progn
							(setq insert_point (cdr (assoc 10 (entget (car (last nentsel_data)))))
								  insert_point (list (car insert_point) (cadr insert_point))
							)
							(vla-getboundingbox (vlax-ename->vla-object (car nentsel_data)) 'llc 'ruc)
							(setq llc (vlax-safearray->list llc)
								  ruc (vlax-safearray->list ruc)
							)
							(grvecs (setq selected_enames_boundings
										  (append selected_enames_boundings
												 (append (list 1)
														(mapcar '(lambda (_list ) (mapcar '+ _list insert_point))
																 (list (list (car llc) (cadr llc)) (list (car llc) (cadr ruc))
																	   (list (car llc) (cadr ruc)) (list (car ruc) (cadr ruc))
																	   (list (car ruc) (cadr ruc)) (list (car ruc) (cadr llc))
																	   (list (car ruc) (cadr llc)) (list (car llc) (cadr llc))
																 )
														)
												 )
										  )
									)
							)
							(if (not (member (setq list_entry (cons (car nentsel_data) (car (last nentsel_data)))) ename_list))
									(setq ename_list (append ename_list (list list_entry)))
							)
						)
				)
		)
	)
)
(if (and
		 ename_list
		 (= 1 exit_value)
	)
		(progn
			(foreach list_member ename_list
				(cond
					(
						 (zerop (vlax-get (vlax-ename->vla-object (cdr list_member)) 'isdynamicblock))
							(vla-put-lineweight (vlax-ename->vla-object (car list_member)) acLnWt200)
					)
					(
						(equal (cdr (assoc 8 (entget (cdr list_member))))
							   (cdr (assoc 2 (entget (cdr list_member))))
						)
							(vla-put-lineweight (vlax-ename->vla-object (car list_member)) acLnWt200)
					)
					(
						t
							(setq object_index 0)
							(while (not (equal
											   (vla-item (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) (cdr (assoc 2 (entget (cdr list_member))))) object_index)
											   (vlax-ename->vla-object (car list_member))
										)
								   )
										(setq object_index (1+ object_index))
							)
							(vla-put-lineweight (vlax-ename->vla-object (car list_member)) acLnWt200)
							(vla-put-lineweight (vla-item (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) (cdr (assoc 8 (entget (cdr list_member))))) object_index) acLnWt200)
					)
				)
			)
			(vla-regen (vla-get-activedocument (vlax-get-acad-object)) acactiveviewport)
		)
)
(redraw)

Последний раз редактировалось koMon, 02.06.2022 в 09:51.
koMon вне форума  
 
Автор темы   Непрочитано 01.06.2022, 11:39
#5
olga87


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


Спасибо!

Но, случается в какой-то момент, что вес применяется только для вхождения динамического блока с атрибутами, т.е. в редакторе блока вес старый.
olga87 вне форума  
 
Непрочитано 02.06.2022, 09:45
#6
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


Цитата:
Сообщение от olga87 Посмотреть сообщение
вес применяется только для вхождения динамического блока
поправил #4 для динамического анонимного блока
koMon вне форума  
 
Автор темы   Непрочитано 02.06.2022, 10:37
#7
olga87


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


Спасибо!

----- добавлено через ~2 ч. -----
Если выбраны элементы, например, от 2-х разных динамических блоков, то код работает только для элемента из первого блока.
olga87 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Изменить вес выбранного элемента блока

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как изменить тип элемента Albino SCAD 5 26.10.2022 14:08
Изменить точку вставки блока Apelsinov AutoCAD 43 04.02.2022 18:34
Можно ли в STARK изменить минимально допустимый размер элемента? Нубий-IV STARK ES 15 27.09.2019 15:00
Как изменить атрибут предварительно выделеного блока VBA shprot Программирование 7 15.05.2012 14:25
Вставка динамического блока - как изменить параметр? vanAvera Программирование 2 23.10.2008 13:39