Здравствуйте, подскажите возможно ли найти все вставки динблоков по имени, если имя на кирилице или на кирилице и имеет пробелы в название? Нашел в сети пример скрипта от А. Ривилиса CalcBlock, CalcBlock1 но они не находит если имя на кирилице, можно ли находить в таком случае или требовать от пользователя чтобы имена блоков были на латинице и не имели пробелов? Я думаю с пробелом наверно не получится, даже если программно задавать имя блока или можно как то в кавычки засунуть ?О каких это моих программах идёт речь? Не вижу ссылок и подтверждения, что что-то не работает.
Так что проблема вымышленная.да мне нечего делать и я выдумал
каких это моих программах идёт речь? Не вижу ссылок и подтверждения, что что-то не работает.
Вот пример программы, которая должна работать: https://adn-cis.org/kak-najti-vse-vstavki-dinamicheskogo-bloka.html
https://forums.autodesk.com/t5/net/c-find-block-references-by-name/td-p/1672857Этот код вообще не работает с динамическими блоками, а не только с кирилицей или пробелами. Коду почти 15 лет и динамические блоки тогда только появились.
не работает с кирилицей и если содержит пробелы
Цитата: Александр Ривилис от 02-11-2020, 10:54:24Это не моя цитата. Так что будь внимательнее.
Так что проблема вымышленная.
да мне нечего делать и я выдумал
да мне нечего делать и я выдумалНе выдумал, а сохранил в тайне код, который не работает.
Это не моя цитата. Так что будь внимательнее.извиняюсь не обратил внимания на это и спасибо за ссылку
Не выдумал, а сохранил в тайне код, который не работает.Мне надо не во всей базе а только в модели, поэтому пользовался тем старым пользовался
Как я сразу и понял вы пытаетесь, ввести строку с пробелами через командную строку. Это возможно, но нужно включить опцию PromptStringOptions.AllowSpaces.
Ну и искать объекты в базе данных чертежа, а не селектом с фильтрами
Мне надо не во всей базе а только в модели, поэтому пользовался тем старым пользовалсяМожно пользоваться тем кодом, который я дал в ссылке, только проверять значение OwnerId - если это ModelSpace, то берёшь, если нет - пропускаешь.
Можно пользоваться тем кодом, который я дал в ссылке, только проверять значение OwnerId - если это ModelSpace, то берёшь, если нет - пропускаешь.OwnerId пытаюсь найти через дебаг, есть кажется только у anonymousBtr и он возвращает числа, как проверить их, лежит ли в модели
Точно! У DBObject есть OwnerId, но это не то. Он у меня в коде один раз используется только у атрибутов. На пространство, куда вставлен Entity указывает именно BlockIdДля примитивов в блоке (в том числе в ModelSpace/PaperSpace) BlockId и OwnerId - это одно и тоже.
Для примитивов в блоке (в том числе в ModelSpace/PaperSpace) BlockId и OwnerId - это одно и тоже.да оказывается одно и то же, только они же числа возращают и в дебаге не нашел есть все кроме Modelspace.
p.p.s Кажется нашел решение сравниваю OwnerId блока с db.CurrentSpaceId, остается проверить по имени.CurrentSpaceId может быть как моделью, так и листом. Чтобы найти Id именно модели, есть разные способы. Мне лично больше всего нравится такой:
Хотел проверить на совпадение имени блока и получил Model_Space оказывается у Entity.Blockname показывает где он лежит или я не прав?Да, у Entity есть такое свойство - BlockName. И имя блока модели можно получить с помощью SymbolUtilityServices.BlockModelSpaceName. И можно сравнивать BlockName у объекта с полученным названием блока модели. Но сравнение строк гораздо более медленнее, чем сравнение Id, которое сводится, по сути, к сравнению чисел.
Сравнивать лучше всего не по имени, а как раз по Id. Если Entity.BlockId (или OwnerId) равен Id модели - значит, объект (примитив) находится в модели.спасибо так и буду делать
Разобрался уже или нет? Или нужно писать пример кода?Да вроде разобрался, спасибо что Вы есть
Yusuf,
Вот вариант кода от Gilles Chanteau:Код - C# [Выбрать]
static IEnumerable<ObjectId> GetAllCurrentSpaceBlocksByName(string blockName) { var db = HostApplicationServices.WorkingDatabase; using (var tr = db.TransactionManager.StartOpenCloseTransaction()) { var curSpace = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForRead); return curSpace .Cast<ObjectId>() .Where(id => id.ObjectClass.DxfName == "INSERT") .Select(id => (BlockReference)tr.GetObject(id, OpenMode.ForRead)) .Where(br => ((BlockTableRecord)tr.GetObject(br.DynamicBlockTableRecord, OpenMode.ForRead)).Name == blockName) .Select(br => br.ObjectId); } }
а как сделать тут чтобы можно было итерировать Id листов, чтобы получить блоки в каждом листе ?Тут не знаю как. А вообще проверить владельца ownerId для каждого из выбранных BlockReference и сравнить с ObjectId BlockTableRecord листов.