Командный режим команды ПБЛОК

Здравствуйте,

в NanoCAD (lisp) команда ПБЛОК по ее завершению удаляет выбранные объекты
(command “_.-WBLOCK” full_path “” ins_point ss “”)
Подскажите пожалуйста, как их НЕ удалять или сразу вернуть?

Не то?

так?

(command "WBLOCK" "c:\\temp\\_tc\\blck.dwg" "блок в чертеже которому пблок")
1 лайк

Да, но стираются выбранные объекты (блоки, примитивы):
Посмотрите пожалуйста приложенный 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, а хотелось бы не оставлять следов, связанных с временным изменением координат.

ЗЫ. Кстати, у красных для этого предусмотрена системная переменная

К сожалению, этой переменной в нанокаде не нашел (((

2 лайка

Спасибо!

Жаль что и команды “база” (может помогла бы) в 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 . Т.е., по вашему алгоритму возврат в случае исходной неименованной ПСК всегда происходит в МСК. А это не есть гут. Фактически вы собьете предустановленную юзером ПСК, если он это делал осознанно.

Поэтому верным видится следующий алгоритм:

  1. Сохраняем текущие значения UCSNAME,UCSORG, UCSXDIR, UCSYDIR
  2. Запрашиваем точку и преобразуем ее в МСК (например, функция trans)
  3. Запрашиваем Набор и преобразуем в ActiveX
  4. Если какой-то из шагов 2,3 не пройден, то выход
  5. Cоздаем временную именованную ПСК с текущими параметрами UCSORG, UCSXDIR, UCSYDIR (назовем oldUCS)
  6. Создаем новую временную именованную ПСК с параметрами [точка→МСК], UCSXDIR, UCSYDIR
  7. Копируем набор в файл
  8. Если на шаге 1 UCSNAME=””, то устанавливаем oldUCS, иначе - именованную ПСК из сохраненного значения UCSNAME
  9. Удаляем (!) и oldUCS, и newUCS

Ну и лучше все манипуляции с (command … сопровождать сбросом/взводом переменной CMDECHO

1 лайк

ogCopyPaste26.zip (3,4 КБ)

Внесла изменения, чтобы ошибки и возврат в прежнюю пск обрабатывался.
*это временное решение

1 лайк

на случай если все эти манипуляции для обхода

этого окна))

по Ctrl + C или Ctrl+Shift+C

нана и не только он создает в %temp% файл *.dwg с содержимым буфера

плохая новость что имя файла рандомное

т.е. задача сводится найти этот файл, применить к нему INSERT и взорвать

еще одна хорошая новость что в нану 26 можно вставлять блоки перетаскивая dwg прямо из проводника.

  1. т.е Ctrl + C
  2. открыл проводник в %temp%
  3. перетащил последний файл в чертеж (поотвечав на запросы в ком строке)
  4. профит

наверное можно автоматизировать, пока нанодевы не пофиксят свою киллер фичу переопределения блоков.

2 лайка

Так?

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 код не мой, бот писал я немного поправил)))


фигак фигак и в продакшен))

1 лайк

Может, есть лайфхак по созданию неименованной ПСК некомандными методами?

не разбирался с этим вопросом((
вообще эта тема живет до след нанообнновления (надеюсь очень, что починят, хотя по опыту предыдущих стрельб сделают еще хуже(((

строго говоря, начало темы было несколько не о вставке, а о способе программной реализации ПБЛОК))). Но запрос на исправление баги с дублированием имен блоков (чуть ранее в который раз уже поднятая в Вставка блока из буфера обмена - Платформа nanoCAD / Технические вопросы - Сообщество nanoCAD) явно масштабнее и носит критический характер

я к тому, что тема родилась как костылик для очередной нанобаги.
я так воспринял
в принципе для сэбэ я при помощи бота на скорую руку костылик слепил, поделился

пск мск для меня темный лес((электрик я, у меня все плоское))