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

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

в 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) явно масштабнее и носит критический характер

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

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

этот запрос сразу был поднят на бетатестировании

вангую добавят третью кнопку “не переопределять”
но чекбокс что бы не спрашивал каждый раз не добавят
если добавят чекбокс, то снимать его придется правкой реестра (в настройки вытащить забудут)


upd По хорошему PASTECLIPнадо делать с параметрами, дабы каждый раз по реестрам и настройкам не нырять и оборачивать макросом по принципу select1..select13

1 лайк