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

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

Проверка значения в toolPalettePath

Ответ
Поиск в этой теме
Непрочитано 29.09.2020, 20:15 #1
Проверка значения в toolPalettePath
olga87
 
Регистрация: 28.05.2007
Сообщений: 142

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

Подскажите пожалуйста как исправить код ниже на лиспе (autocad 2020), который проверяет есть ли в "exPath" только путь1 или только путь2 (без других путей) и если одного такого пути нет, то выполнить процедуру xxxx.
Заранее спасибо!

Код:
[Выделить все]
(setq pFiles (vla-get-files (vla-get-preferences (vlax-get-acad-object))))
  (setq exPath (vla-get-toolPalettePath pFiles))

  (if (or \= exPath ("C:\\путь1") ("C:\\путь2"))
    (princ "путь1 или путь2 отсутствует")
    (princ "другие пути")
  )

Последний раз редактировалось olga87, 29.09.2020 в 20:23.
Просмотров: 1654
 
Непрочитано 29.09.2020, 22:23
#2
Кулик Алексей aka kpblc
Moderator

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


Без проверки:
Код:
[Выделить все]
 (defun t1 ()
  (defun _kpblc-conv-string-to-list (string separator / i)
    (cond ((= string "") nil)
          ((= separator "") (list string))
          ((vl-string-search separator string)
           ((lambda (/ pos res)
              (while (setq pos (vl-string-search separator string))
                (setq res    (cons (substr string 1 pos) res)
                      string (substr string (+ (strlen separator) 1 pos))
                ) ;_ end of setq
              ) ;_ end of while
              (reverse (cons string res))
            ) ;_ end of lambda
           )
          )
          ((wcmatch (strcase string) (strcat "*" (strcase separator) "*"))
           ((lambda (/ pos res _str prev)
              (setq pos  1
                    prev 1
                    _str (substr string pos)
              ) ;_ end of setq
              (while (<= pos (1+ (- (strlen string) (strlen separator))))
                (if (wcmatch (strcase (substr string pos (strlen separator))) (strcase separator))
                  (setq res    (cons (substr string 1 (1- pos)) res)
                        string (substr string (+ (strlen separator) pos))
                        pos    0
                  ) ;_ end of setq
                ) ;_ end of if
                (setq pos (1+ pos))
              ) ;_ end of while
              (if (< (strlen string) (strlen separator))
                (setq res (cons string res))
              ) ;_ end of if
              (if (or (not res) (= _str string))
                (setq res (list string))
                (reverse res)
              ) ;_ end of if
            ) ;_ end of lambda
           )
          )
          (t (list string))
    ) ;_ end of cond
  ) ;_ end of defun
  (setq check-paths '("c:\\path1"
                      "c:\\path2"
                      "c:\\path3"
                      "C:\\Users\\kpblc\\AppData\\Roaming\\Autodesk\\AutoCAD 2013 - English\\R19.0\\enu\\Support\\ToolPalette"
                     )
        exist_paths (mapcar (function strcase)
                            (vl-remove ""
                                       (_kpblc-conv-string-to-list (vla-get-toolpalettepath (vla-get-files (vla-get-preferences (vlax-get-acad-object))))
                                                                   ";"
                                       ) ;_ end of _kpblc-conv-string-to-list
                            ) ;_ end of vl-remove
                    ) ;_ end of mapcar
  ) ;_ end of setq
  (foreach path (vl-remove-if (function (lambda (x) (member (strcase x) exist_paths))) check-paths)
    (xxxx path)
  ) ;_ end of foreach
) ;_ end of defun
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 30.09.2020, 07:34
#3
olga87


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


Спасибо большое!

Можно еще вопрос: у меня не получается применить этот код к моей задаче. Задача следующая, например:
1случай:
а. Смотрим в существующие пути к палитрам в настройках Автокада
(видим: C:\Users\user\AppData\Roaming\Autodesk\AutoCAD 2020\R23.1\rus\Support\ToolPalette
C:\CAD\ToolPalettes
C:\temp)
б. Т.к. это НЕ равно "C:\путь1" либо "C:\путь2", то далее нужно записать эти 3-и пути в файл txt

Код:
[Выделить все]
	(if (setq file (open "C:\\MyToolPaths\\Paths.txt" "w"))
		(progn
			(write-line exPath file)
			(close file)
		)
	)
2случай:
а. Смотрим в существующие пути к палитрам в настройках Автокада
(видим: C:\путь1)
б. Т.к. это равно "C:\путь1" либо "C:\путь2", то ничего далее в коде делать не нужно.

3случай:
а. Смотрим в существующие пути к палитрам в настройках Автокада
(видим: C:\путь2)
б. Т.к. это равно "C:\путь1" либо "C:\путь2", то ничего далее в коде делать не нужно.

Как дополнить Ваш код для моей задачи?
olga87 вне форума  
 
Непрочитано 30.09.2020, 10:14
#4
koMon


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


olga87, как получается, что вы вроде и говорите на лиспе, но дальше алгоритмических заготовок не двигаетесь?!
Код:
[Выделить все]
 
(setq exPath (vla-get-toolPalettePath (vla-get-files (vla-get-preferences (vlax-get-acad-object)))))
(setq custom_path_list (list "c:\\Путь1" "c:\\Путь2"))
(if (equal custom_path_list (setq temp_custom_path_list (vl-remove-if 'vl-symbolp (mapcar '(lambda (custom_path) (if (vl-string-search (strcase custom_path) (strcase exPath))
 							   																							t
																														custom_path
 																					  	   						 )
 																 	 					   )
 																	 						custom_path_list
 																				  )
										  				)
							)
  	)
    (if (setq file (open "C:\\MyToolPaths\\Paths.txt" "w"))
		(progn
			(write-line exPath file)
			(foreach custom_path temp_custom_path_list
				(write-line custom_path file)
			)
			(close file)
		)
	)
)
ещё вариант

Код:
[Выделить все]
 
(setq exPath (vla-get-toolPalettePath (vla-get-files (vla-get-preferences (vlax-get-acad-object)))))
(setq custom_path_list (list "c:\\Путь1" "c:\\Путь2"))
(setq temp_custom_path_list nil)
(if (equal custom_path_list (foreach custom_path custom_path_list
								(if (vl-string-search (strcase custom_path) (strcase exPath))
										temp_custom_path_list
										(setq temp_custom_path_list (append temp_custom_path_list (list custom_path)))
  	   						 	)
							)
  	)
    (if (setq file (open "C:\\MyToolPaths\\Paths.txt" "w"))
		(progn
			(write-line exPath file)
			(foreach custom_path temp_custom_path_list
				(write-line custom_path file)
			)
			(close file)
		)
		(progn
			(write-line exPath file)
			(close file)
		)
	)
)

Последний раз редактировалось koMon, 01.10.2020 в 11:21.
koMon вне форума  
 
Автор темы   Непрочитано 30.09.2020, 10:32
#5
olga87


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


я пишу на c#, но язык Лисп для меня сложнее кажется, не могу его еще понять.
За ответ спасибо большое, проверю.

----- добавлено через ~9 ч. -----
Код:

Код:
[Выделить все]
(setq exPath (vla-get-toolPalettePath (vla-get-files (vla-get-preferences (vlax-get-acad-object)))))
(setq custom_path_list (list "c:\\Путь1" "c:\\Путь2"))
(setq temp_custom_path_list nil)
(if (equal custom_path_list (foreach custom_path custom_path_list
								(if (vl-string-search (strcase custom_path) (strcase exPath))
										temp_custom_path_list
										(setq temp_custom_path_list (append temp_custom_path_list (list custom_path)))
  	   						 	)
							)
  	)
    (if (setq file (open "C:\\MyToolPaths\\Paths.txt" "w"))
		(progn
			(write-line exPath file)
			(foreach custom_path temp_custom_path_list
				(write-line custom_path file)
			)
			(close file)
		)
	)
)
работает не совсем правильно согласно моей задаче: если в "exPath" код находит любой путь из списка "custom_path_list", то такой "exPath" не сохраняется в txt, а должен!
Видимо логика моей задачи не удобная. Я думаю сделать ИНАЧЕ, а именно:

Подскажите пожалуйста, как исправить код, чтобы ВСЕ пути из "exPath" сохранялись (записывались с добавлением) в файл TXT, кроме путей "c:\\Путь1" и "c:\\Путь2" (кроме путей из "custom_path_list" если таковые будут в "exPath"). Причем при записи в TXT исключить дублирование путей (записей). Может быть возможно считывать каждый путь отдельно в новую строку в txt?
Спасибо заранее!

Последний раз редактировалось olga87, 01.10.2020 в 06:52.
olga87 вне форума  
 
Непрочитано 01.10.2020, 11:22
#6
koMon


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


для того, чтобы было по вашей логике нужно вписать else в конструкцию (if (setq file...)) см. вариант 2 в #4. это для записи exPath в txt только.

----- добавлено через ~15 мин. -----
для работы с файлом txt нужно понимание:
1. этот файл создаётся когда?
2. этот файл модифицируется (перезаписывается) с дополнениями к первоначальной записи или он перетирается и пишется с новыми данными, полученными лиспом?
3. если файл модифицируется, то в момент модификации кастомные пути могут уже быть в файле?

Последний раз редактировалось koMon, 01.10.2020 в 11:27.
koMon вне форума  
 
Автор темы   Непрочитано 01.10.2020, 12:40
#7
olga87


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


1. этот файл создаётся когда?

Думаю в начале
Код:
[Выделить все]
(if (null (vl-file-directory-p "C:\\MyToolPaths"))
    (vl-mkdir "C:\\MyToolPaths")
)
, а когда работает условие (if (setq file (open "C:\\MyToolPaths\\Paths.txt" "w")) файл txt создается нормально.

2. этот файл модифицируется (перезаписывается) с дополнениями к первоначальной записи или он перетирается и пишется с новыми данными, полученными лиспом?

Добавлять с дополнениями к первоначальной записи.

3. если файл модифицируется, то в момент модификации кастомные пути могут уже быть в файле?

Не должны.

Задача: Взять все текущие пути к палитрам (из exPath например) и сохранить (с добавлением) в файл TXT, кроме путей "c:\\Путь1" и/или "c:\\Путь2" (кроме путей из "custom_path_list" если таковые будут присутствовать в "exPath" на момент работы кода). Причем при записи в TXT исключить дублирование путей (записей).

Пример:

1) в начале имеем пути:
C:\Users\user1\AppData\Roaming\Autodesk\AutoCAD 2020\R23.1\rus\Support\ToolPalette;C:\Путь1;C:\cad
либо
C:\Users\user1\AppData\Roaming\Autodesk\AutoCAD 2020\R23.1\rus\Support\ToolPalette;C:\Путь2;C:\cad
либо
C:\Users\user1\AppData\Roaming\Autodesk\AutoCAD 2020\R23.1\rus\Support\ToolPalette;C:\Путь2;C:\cad;C:\Путь1
вообщем любые вариации, и таких кастомных путей (которые не нужно иметь в txt при записи) "c:\\Путь1" и "c:\\Путь2" может быть несколько (около 10 например).

2) нужно в txt записать с добавлением все пути, кроме: "c:\\Путь1" "c:\\Путь2" и др. из "custom_path_list".
Причем, если один или несколько путей (не кастомных) уже есть в этом txt, то повторно их добавлять НЕ нужно, т.е. исключить помимо "custom_path_list" и дубликаты.

3) В дальнейшем нужно все пути из этого txt применить к путям к палитрам (вернуть их), когда пользователь этого захочет, например, по кнопке с кодом.

Последний раз редактировалось olga87, 01.10.2020 в 12:47.
olga87 вне форума  
 
Непрочитано 02.10.2020, 09:04
#8
koMon


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


Код:
[Выделить все]
 
;**************************************************************************************************************

(defun sort_string_list (in_list)
	(vl-sort in_list
		 	'(lambda (string_1 string_2)
		 		  (< (strcase string_1) (strcase string_2))
		 	 )
	)
)

;**************************************************************************************************************

(defun string_to_list (input_string delimiter / delimiter_position output_list)
	(setq delimiter_position 0)
	(while delimiter_position
		(setq delimiter_position (vl-string-search delimiter input_string 0))
		(if (null delimiter_position)
			(setq output_list (append output_list (list input_string)))
			(setq output_list (append output_list (list (print (substr input_string 1 delimiter_position))))
				  input_string (substr input_string (+ 2 delimiter_position))
			)
		)
	)
	output_list
)

;**************************************************************************************************************

(defun delete_successive_duplicates (input_list / output_list input_list_index)
	(setq input_list_index 0)
	(repeat (length input_list)
		(if (equal
				(vl-catch-all-apply 'strcase (list (nth input_list_index input_list)))
				(vl-catch-all-apply 'strcase (list (nth (1+ input_list_index) input_list)))
			)
  				(setq input_list (cdr input_list))
  				(setq output_list (cons (nth input_list_index input_list) output_list)
					  input_list_index (+ 1 input_list_index)
				)
		)
	)
	(reverse output_list)
)

;**************************************************************************************************************

(setq exPath_list (delete_successive_duplicates (sort_string_list (string_to_list (vla-get-toolPalettePath (vla-get-files (vla-get-preferences (vlax-get-acad-object)))) ";"))))
(setq custom_path_list (list "c:\\Путь1" "c:\\Путь2" "c:\\Путь3" "c:\\Путь4" "c:\\Путь5" "c:\\Путь6" "c:\\Путь7" "c:\\Путь8" "c:\\Путь9" "c:\\Путь10" "c:\\Путь11"))
(setq my_tool_path "C:\\MyToolPaths")
(setq my_tool_path_filename "Paths.txt")
(setq my_tool_path_filename_full (strcat my_tool_path "\\" my_tool_path_filename))
(setq file_paths_read_list nil)

(if (null (vl-file-directory-p my_tool_path))
    (vl-mkdir my_tool_path)
	(cond
		(
			(findfile my_tool_path_filename_full)
				(princ "Файл \"")
				(setq file (open (princ my_tool_path_filename_full) "r"))
				(princ "\"\nдо\n")
				(while (setq path_line_read (read-line file))
					(setq file_paths_read_list (append file_paths_read_list (list path_line_read)))
					(princ path_line_read)
					(princ "\n")
				)
				(close file)
		)
		(
			t
		)
	)
)
(princ "\n***************************\nпосле\n")
(setq path_to_add (delete_successive_duplicates (sort_string_list (append exPath_list file_paths_read_list))))
(foreach path path_to_add
	(if (member (strcase path) (mapcar 'strcase custom_path_list))
		(setq path_to_add (vl-remove path path_to_add))
	)
)
(setq file (open my_tool_path_filename_full "w"))
(foreach path path_to_add
	(write-line (princ path) file)
	(princ "\n")
)
(close file)
(princ)

;**************************************************************************************************************

Последний раз редактировалось koMon, 02.10.2020 в 17:40.
koMon вне форума  
 
Автор темы   Непрочитано 02.10.2020, 12:30
#9
olga87


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


Спасибо большое!
Я тоже это время пыталась решить задачу но в c# и столкнулась что нужно обрабатывать знак ";" (поскольку настройки к палитрам хранятся как строка с разделителем). Вы сделали списком (красиво сделано, удобно в работе).

Я еще проверю с разными ситуациями Ваш код в работе (и отпишусь), сейчас сразу заметила: НЕ нужно в файл txt добавлять "кастомные" пути, т.е. если среди "exPath_list" есть "кастомные пути", то их нужно исключить (НЕ передовать в txt).
Подскажите пожалуйста, как исправить Ваш код, добавив это условие исключения?

Последний раз редактировалось olga87, 02.10.2020 в 12:57.
olga87 вне форума  
 
Непрочитано 02.10.2020, 16:19
#10
koMon


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


если оценивать кастомность путей по запредельности от "c:\users", то можно удалить их из списка функцией (delete_custom_path), см. #8
koMon вне форума  
 
Автор темы   Непрочитано 02.10.2020, 16:43
#11
olga87


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


Нужно просто из всех путей (exPath_list) исключить "кастомные" (это пути которые создаются мной, как шаблонные, т.е. они в txt не должны записываться).

Если исправить, как ниже:

Код:
[Выделить все]
(defun delete_custom_path (in_list)
	(foreach path in_list
		(if (vl-string-search (strcase "C:\\путь1") (strcase path))  ;C:\\путь1 - кастомный
			(setq in_list (vl-remove path in_list))
		)
	)
	in_list
)
то работает.

Последний раз редактировалось olga87, 02.10.2020 в 17:11.
olga87 вне форума  
 
Непрочитано 02.10.2020, 17:17
#12
koMon


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


давайте внесём ясность в чтение и запись данных.
1. лисп не запущен. toolPalettePath хранит, например "C:\Users\user1\AppData\Roaming\Autodesk\AutoCAD 2020\R23.1\rus\Support\ToolPalette;C:\Путь2;C:\cad;C:\Путь1". файла txt нет.
2. запускаем лисп, он читает toolPalettePath в список. в лиспе определён список кастомных путей, например ("c:\Путь1" "c:\Путь2").
3. после отработки лиспа нужно чтобы в созданный txt записались пути, которые были в toolPalettePath, кроме ("c:\Путь1" "c:\Путь2"), но с "C:\cad"? или?

----- добавлено через ~3 мин. -----
Цитата:
Сообщение от olga87 Посмотреть сообщение
то работает
koMon вне форума  
 
Автор темы   Непрочитано 02.10.2020, 17:21
#13
olga87


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


Да, верно.
Т.е. результат, например: "C:\Users\user1\AppData\Roaming\Autodesk\AutoCAD 2020\R23.1\rus\Support\ToolPalette;C:\cad

Только нужно сделать циклом, чтобы все кастомные (когда их несколько) удалялись из списка txt.
Код:
[Выделить все]
(defun delete_custom_path (in_list)
	(foreach custom_path custom_path_list
	  (foreach path in_list
		(if (vl-string-search (strcase custom_path) (strcase path))
			(setq in_list (vl-remove path in_list))
		)
	  )
	  
    )
	in_list
)
Код работает! Спасибо за Ваши знания, потраченное время и терпение!

Последний раз редактировалось olga87, 02.10.2020 в 17:38.
olga87 вне форума  
 
Непрочитано 02.10.2020, 17:42
#14
koMon


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


я скорректировал код в #8, видимо так, как это должно быть финально
koMon вне форума  
 
Автор темы   Непрочитано 02.10.2020, 17:57
#15
olga87


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


Да, спасибо еще раз!
olga87 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Проверка значения в toolPalettePath

Реверс. Автоматическая пакетная печать множества рамок (форматов) из пространства модели и листов
Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выбор правильного значения усилия затяжки для высокопрочных болтов М30 dik-son Металлические конструкции 8 21.10.2017 21:36
Как вставить в текстовое поле первые символы значения свойства чертежа (подшивки)? KiisteN Программирование 5 21.10.2017 14:46
Схемы сдвига грунта в геологическом отчете. Какие принимать значения для сцепления и угла внутреннего трения при различных схемах сдвига? kuatro777 Основания и фундаменты 6 24.10.2013 00:52
Значения экстремумов на стержнях zlo270 Лира / Лира-САПР 3 26.02.2012 23:30
Программная вставка блока с атрибутами в таблицу. Как сохранить установленные значения атрибутов? Кулик Алексей aka kpblc Программирование 8 22.07.2010 15:01