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

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

Неповторяющиеся имена неименованных блоков

Ответ
Поиск в этой теме
Непрочитано 20.03.2023, 17:05 #1
Неповторяющиеся имена неименованных блоков
Pilot
 
Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,268

Это скорее не вопрос, а для обсуждения.
И не знаю куда лучше - сюда или в программирование. Решил сюда. Если модератор решит что лучше в программирование, то можно перенести.

Eсли выбрать объекты по Ctrl+Shift+C, а потом вставить по Ctrl+Shift+C, по получится неименованный блок с именем типа A$C3222377B
Вроде бы здесь на форуме писали об алгоритме создания таких имен, и что будто там задействован рандомайзер.
Но известно, что такие имена из разных чертежей могут случайно совпасть. За многолетнюю практику я с этим столкнулся всего пару раз, но все же столкнулся.
Я подумал, а можно ли создавать имена таких блоков чтобы они никогда не повторялись? И соорудил такой простенький лиспик, где имя блока получается через (getvar "CDATE"):

Код:
[Выделить все]
 
(defun c:QuickBlock ( / n1 p1 s1) ; Быстрое создание блока со вставкой в то же место.
   (setq n1 (strcat "A$" (rtos (getvar "CDATE") 2 7))
         p1 (getpoint "\nBase point:")
         s1 (ssget))
(setvar "cmdecho" 0)(command "-block" n1 p1 s1 "")(command "-insert" n1 p1 1 1 0)
(princ (strcat "\nСоздан блок " n1))
(princ))
В результате получается блок с именем типа A$20230320.1651588
Т.е.: A$ год месяц число . часы минуты секунды десятые_доли_секунды (хотел до сотых но не получается).
Можно предположить, что вероятность совпадения таких имен крайне мала, особенно в рамках одной организации. А при индивидуальном применении и вовсе невозможно.

Почему Автодеск не пошел по такому, казалось бы, более простому и надежному пути?
Или я чего-то недопонял и не учел?
Просмотров: 912
 
Непрочитано 20.03.2023, 17:38
#2
Dinoxromniy


 
Регистрация: 14.09.2020
Санкт-Петербург
Сообщений: 333


Лично я не вижу в вашей логике наименования недостатков.
С другой стороны - неименованными блоками стараюсь не пользоваться, потом мороки с ними больше, чем экономия на вводе осмысленного названия - и даже при этом попадал на совпадения имен, правда чужих.
Dinoxromniy на форуме  
 
Непрочитано 20.03.2023, 20:01
#3
ShaggyDoc

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


Цитата:
Сообщение от Pilot Посмотреть сообщение
Почему Автодеск не пошел по такому, казалось бы, более простому и надежному пути?
Потому что его писали программисты, которые знают, что воистину случайное число (а потом строку) получить практически невозможно.

Задачу
Цитата:
Но известно, что такие имена из разных чертежей могут случайно совпасть. За многолетнюю практику я с этим столкнулся всего пару раз, но все же столкнулся.
они и не решали.


Цитата:
Сообщение от Pilot Посмотреть сообщение
Вроде бы здесь на форуме писали об алгоритме создания таких имен, и что будто там задействован рандомайзер.
Да, это было здесь.

Можно и так

Код:
[Выделить все]
 (defun ru-string-unique (/ currt temp)
  ;; уникальный код 14 символов
  (setq currt (substr (rtos (getvar "CDATE") 2 8) 3)
   temp currt)
  (while (= temp currt)
    (setq currt (substr (rtos (getvar "CDATE") 2 8) 3))
  )
  (strcat (substr currt 1 6) (substr currt 8))
) 
Это будет также псевдослучайное число. Ведь может же быть, что "где-то там, в горах" в ту же секунду кто-то создает такое же имя, а потом эти чертежи встретятся.
ShaggyDoc вне форума  
 
Непрочитано 20.03.2023, 20:16
#4
Кулик Алексей aka kpblc
Moderator

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


Уж лучше тогда вообще GUID генерировать ))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.03.2023, 20:55
#5
ShaggyDoc

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Уж лучше тогда вообще GUID генерировать ))
Напрямую никак, надо использовать Scriptlet.TypeLib, которая может быть и "забанена".

Много как можно сделать через собственные COM (это надежней), но здесь надо проще.
ShaggyDoc вне форума  
 
Непрочитано 20.03.2023, 21:04
#6
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,040


уникальность имени вашего варианта ограничивается - файлы, расположенные на одной рабочей станции. Да и то, если с датой и временем играться пользователь не будет. А так же не будет использовать генерацию блоков чаще, чем дискретность таймера временного.
Сергей812 вне форума  
 
Непрочитано 20.03.2023, 21:09
#7
Кулик Алексей aka kpblc
Moderator

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


Offtop:
Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Напрямую никак, надо использовать Scriptlet.TypeLib, которая может быть и "забанена".
Ну, на шарпе вопрос нескольких строк, включая объявление лисп-функции )))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 21.03.2023, 12:21
#8
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,268


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

Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Да, это было здесь.
Ух ты! Это же было 16.5 лет назад! И даже я тогда поучаствовал в обсуждении. Перечитал с интересом.

Цитата:
Сообщение от Сергей812 Посмотреть сообщение
1. уникальность имени вашего варианта ограничивается - файлы, расположенные на одной рабочей станции.
2. Да и то, если с датой и временем играться пользователь не будет.
3. А так же не будет использовать генерацию блоков чаще, чем дискретность таймера временного.
1. Это почему на одной рабочей станции? У меня коллеги и в офисе и в других городах - если им понравится, смогут пользоваться.
2. И с какой стати пользователю "играться" с датой/временем? Цель?
3. Дискретность у меня получилась 0.1 секунды. Один человек физически не сможет чаще. Для всего мира этого возможно и недостаточно, но для группы в несколько человек вероятность совпадения крайне мала.

В общем я намеренно отказался от ГСЧ. Чтобы гарантированно уйти от случайных совпадений имен использовал уходящее в прошлое время. Попутно по имени блока можно выяснить когда он был создан.

----------------------------
P.s.
В своем лиспе отбросил две первые цифры года и повысил точность - дискретность получилась в десятитысячную долю секунды. Теперь про совпадение имен можно забыть.
Единственно - формат имени стал чуть менее вразумителен: A$230321.1313068122

Код:
[Выделить все]
 
(defun c:QB ( / n1 p1 s1) 
   (setq n1 (strcat "A$" (rtos (- (getvar "CDATE") 20000000) 2 10))
         p1 (getpoint "\nBase point:")
         s1 (ssget))
(setvar "cmdecho" 0)(command "-block" n1 p1 s1 "")(command "-insert" n1 p1 1 1 0)
(princ (strcat "\nСоздан блок " n1))
(princ))

Последний раз редактировалось Pilot, 21.03.2023 в 13:18.
Pilot на форуме  
 
Непрочитано 21.03.2023, 13:23
#9
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,040


Цитата:
Сообщение от Pilot Посмотреть сообщение
1. Это почему на одной рабочей станции? У меня коллеги и в офисе и в других городах - если им понравится, смогут пользоваться.
потому что в каждый момент времени на рабочей станции пользователь может создать только один блок. Соответственно, при этом более-менее гарантируется уникальность имени блока на основе временной метки. Если работают несколько человек на разных машинах - то появляется возможность совпадения этих имен, т.е. другой пользователь создать блок с той же временной меткой в качестве имени. Хотя если взять не lisp, а .Net - там временные кванты в 100нс, и вероятность дубликата снижается существенно.

Цитата:
Сообщение от Pilot Посмотреть сообщение
2. И с какой стати пользователю "играться" с датой/временем? Цель?
действия пользователей не всегда поддаются логическому объяснению
Сергей812 вне форума  
 
Непрочитано 21.03.2023, 14:06
#10
Кулик Алексей aka kpblc
Moderator

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


А если еще вспомнить, что с какой-то версии (getvar "cdate") начал выдавать некорректные результаты в части долей секунд - ситуация становится немного забавнее.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 21.03.2023, 14:21
#11
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,268


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
1. потому что в каждый момент времени на рабочей станции пользователь может создать только один блок. Соответственно, при этом более-менее гарантируется уникальность имени блока на основе временной метки.
2. Если работают несколько человек на разных машинах - то появляется возможность совпадения этих имен, т.е. другой пользователь создать блок с той же временной меткой в качестве имени.
1. Учитывая что удалось довести дискретность до десятитысячной секунды - то не "более-менее", а физически невозможно.
Пользователю в продолжении даже одной секунды крайне сложно дважды выполнить эту команду (с указанием точки и с выбором объектов).
2. Теоретически да. Практически вероятность ничтожна по причине из п.1.

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А если еще вспомнить, что с какой-то версии (getvar "cdate") начал выдавать некорректные результаты в части долей секунд - ситуация становится немного забавнее.
Не знал
Pilot на форуме  
 
Непрочитано 21.03.2023, 14:35
#12
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от Pilot Посмотреть сообщение
2. Теоретически да. Практически вероятность ничтожна по причине из п.1.
Закон: Если какая-нибудь неприятность может случиться, она случается.
Следствие: Если вероятность какой то неприятности из списка минимальна, то именно эта неприятность и произойдет.
Boxa вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Неповторяющиеся имена неименованных блоков

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какой язык перспективен для инженера-конструктора с условием The_Mercy_Seat Программирование 705 17.03.2021 14:19
Влияет ли разрядность операционной системы и АвтоКАДа на допустимые имена блоков и на их редактирование? Archeo AutoCAD 38 14.08.2013 15:29
Имена динамических блоков Zaghim Программирование 43 02.06.2011 13:20
Тормозит команда расчленения набора блоков batmax Программирование 4 31.08.2010 17:37
Подсчет и сортировка блоков на текущем слое. Помогите отредактировать. Kortes Программирование 17 26.03.2010 18:46