Здравствуйте,
в NanoCAD (lisp) команда ПБЛОК по ее завершению удаляет выбранные объекты
(command “_.-WBLOCK” full_path “” ins_point ss “”)
Подскажите пожалуйста, как их НЕ удалять или сразу вернуть?
Здравствуйте,
в NanoCAD (lisp) команда ПБЛОК по ее завершению удаляет выбранные объекты
(command “_.-WBLOCK” full_path “” ins_point ss “”)
Подскажите пожалуйста, как их НЕ удалять или сразу вернуть?
так?
(command "WBLOCK" "c:\\temp\\_tc\\blck.dwg" "блок в чертеже которому пблок")
Да, но стираются выбранные объекты (блоки, примитивы):
Посмотрите пожалуйста приложенный lisp (ogWBLOCKEXPORT - пблок в файл *стираются объекты / ogINSLAST - вставить блок из файла с расчленением при вставке)
CopyPast26.zip (2,4 КБ)
для aCAD можно (command “_.oops”) после wblock, но не работает в NanoCAD, может есть в MultiCAD.NET API? Использовать undo не хочется, лучше чтобы вообще не затиралось.*Пока у себя использую этот лисп с командой undo после wblock
Может, имеет смысл испробовать функции ActiveX?
Фрагмент ниже формирует набор и “выплевывает” его в файл, используя при этом текущую систему координат . Объекты остаются на месте.
(defun c:eds_WBlock_example( / doc nab fname)
;Получаем набор
(setq nab (ssget))
(if (not nab) (exit))
;Конвертируем набор в формат ActiveX
(setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
(setq vl-nab (vla-get-ActiveSelectionSet doc))
;Имя файла (имя блока). Подставляем любое подходящее
(setq fname "C:\\t\\eds_WBlock_example.dwg")
(vla-Wblock doc fname vl-nab)
)
При необходимости изменения UCS (изменение точки вставки - это частный случай) необходимо добавить фрагмент с запросом точки, созданием новой UCS и ее активизацией. Ну и правило хорошего тона - возврат в UCS в исходное состояние. Сходу накидать этот фрагмент не удалось, т.к. все найденное сводилось к созданию именованных UCS, а хотелось бы не оставлять следов, связанных с временным изменением координат.
ЗЫ. Кстати, у красных для этого предусмотрена системная переменная
К сожалению, этой переменной в нанокаде не нашел (((
Спасибо!
Жаль что и команды “база” (может помогла бы) в nanocad нет - если ПСК (ее новое начало) в “ условной” точке вставки, то при команде “вставка” скопированные объекты рядом с указываемой точкой вставки оказываются, иначе объекты далеко от точки вставляются.
А если создать временную ПСК как “новое начало“ и посадить на запрос как бы точки вставки, а на самом деле - это временное создание безымянной ПСК с началом в точек вставки (*тогда последующая вставка корректнее по расположению объектов будет)?
Да, в новом файле текущая ПСК станет МСК - именно то, что нужно.
Все примеры с созданием временной ПСК приведены с учетом создания именованных ПСК. Если необходимо “не оставлять следов”, то нужно немного поэкспериментировать.
UPD. Проверил одну задумку. Оказалось, что можно удалить текущую именованную ПСК. При этом ПСК сбрасывается в неименованную, но с текущими параметрами. Это означает, что можно при необходимости создавать временную именованную ПСК с текущими параметрами (old), потом создать ПСК со смещением (после ввода точки - new), “выплюнуть” набор в файл, установить old, удалить new и удалить old (если она создавалась.
Пока дополнила lisp созданием временной ПСК и запросом базовой точки (баз.т. как новое начало текущей ПСК), копировать (пблок в файл), возврат ПСК - затем вставить (*корректнее получилось). Ждем также исправлений в следующей версии NanoCAD.
Спасибо!
Хорошо, что получилось.
Только не совсем понял, в чем именно корректнее. Удалось создать неименованную временную ПСК? И как осуществлен возврат ПСК?
Как-то так (временное решение):
ogCopyPaste26.zip (3,0 КБ)
*корректнее - объекты рядом с баз.т. при вставке
команда ПБЛОК не берет 4-ре параметра (иначе без ПСК было бы)?
(vla-wblock (vla-get-activedocument (vlax-get-acad-object))
file
(vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object)))
(vlax-3d-point pnt) ; Insertion Point
)
или через создание блока, который в ПБЛОК,.. - слишком длинный алгоритм
Не сочтите за брюзжание, но такой алгоритм не совсем корректен.
Фишка в том, что любое изменение ПСК без выбора из именованных ПСК сбрасывает “UCSNAME” в ““. Но это не значит, что устанавливается МСК.
На скрине имеем UCSNAME = ““, но ПСК не совпадает с МСК, что подтверждается и переменными UCSXDIR и UCSYDIR . Т.е., по вашему алгоритму возврат в случае исходной неименованной ПСК всегда происходит в МСК. А это не есть гут. Фактически вы собьете предустановленную юзером ПСК, если он это делал осознанно.
Поэтому верным видится следующий алгоритм:
Ну и лучше все манипуляции с (command … сопровождать сбросом/взводом переменной CMDECHO
ogCopyPaste26.zip (3,4 КБ)
Внесла изменения, чтобы ошибки и возврат в прежнюю пск обрабатывался.
*это временное решение
на случай если все эти манипуляции для обхода
по Ctrl + C или Ctrl+Shift+C
нана и не только он создает в %temp% файл *.dwg с содержимым буфера
плохая новость что имя файла рандомное
т.е. задача сводится найти этот файл, применить к нему INSERT и взорвать
еще одна хорошая новость что в нану 26 можно вставлять блоки перетаскивая dwg прямо из проводника.
наверное можно автоматизировать, пока нанодевы не пофиксят свою киллер фичу переопределения блоков.
Так?
ogPaste26.zip (1,5 КБ)
*можно многократно вставлять
попрошу тапками не кидать))
копируем фрагмент чертежа как обычно
по Ctrl + C или Ctrl+Shift+C
вставляем командой NC_PASTECLIPDWG
using HostMgd.ApplicationServices;
using HostMgd.EditorInput;
using System;
using System.Globalization;
using System.IO;
using System.Linq;
using Teigha.Geometry;
using Teigha.Runtime;
//(command "-INSERT" "c:\\temp\\a6df.dwg" "0,0,0" "1" "1" "0")
namespace KpblcDrzBlockFix.NCad.CadCommands
{
public partial class BlockNormalizeCmd
{
// Команда для NanoCAD
[CommandMethod("NC_PASTECLIPDWG")]
public void PasteClipboardDwg()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Editor ed = doc.Editor;
try
{
string dwg = FindClipboardDwg();
if (dwg == null)
{
ed.WriteMessage("\nDWG из буфера не найден.");
return;
}
Point3d pt = AskInsertPoint(ed);
ExecuteInsert(doc, dwg, pt);
ExecuteExplodeLast(doc);
}
catch (System.Exception ex)
{
ed.WriteMessage($"\nОшибка: {ex.Message}");
}
}
private string FindClipboardDwg()
{
string temp = Path.GetTempPath();
FileInfo? file = new DirectoryInfo(temp)
.GetFiles("*.dwg")
.OrderByDescending(f => f.LastWriteTime)
.FirstOrDefault();
return file?.FullName;
}
private Point3d AskInsertPoint(Editor ed)
{
PromptPointResult p = ed.GetPoint("\nУкажите точку вставки: ");
if (p.Status != PromptStatus.OK)
{
throw new OperationCanceledException();
}
return p.Value;
}
private void ExecuteInsert(Document doc, string dwg, Point3d pt)
{
string p = FormatPoint(pt);
dwg = dwg.Replace("\\", "\\\\");
string cmd =
"-INSERT\n" +
$"{dwg}\n" +
$"{p}\n" +
"1\n" +
"1\n" +
"0\n";
doc.SendStringToExecute(cmd, true, false, false);
}
private void ExecuteExplodeLast(Document doc)
{
doc.SendStringToExecute("EXPLODE L\n", true, false, false);
}
private string FormatPoint(Point3d pt)
{
return string.Format(
CultureInfo.InvariantCulture,
"{0},{1},{2}",
pt.X, pt.Y, pt.Z);
}
}
}
PS код не мой, бот писал я немного поправил)))
Может, есть лайфхак по созданию неименованной ПСК некомандными методами?
не разбирался с этим вопросом((
вообще эта тема живет до след нанообнновления (надеюсь очень, что починят, хотя по опыту предыдущих стрельб сделают еще хуже(((
строго говоря, начало темы было несколько не о вставке, а о способе программной реализации ПБЛОК))). Но запрос на исправление баги с дублированием имен блоков (чуть ранее в который раз уже поднятая в Вставка блока из буфера обмена - Платформа nanoCAD / Технические вопросы - Сообщество nanoCAD) явно масштабнее и носит критический характер
я к тому, что тема родилась как костылик для очередной нанобаги.
я так воспринял
в принципе для сэбэ я при помощи бота на скорую руку костылик слепил, поделился
пск мск для меня темный лес((электрик я, у меня все плоское))