Lucrul cu un document inactiv, autolisp

Majoritatea covârșitoare a funcțiilor lisp afișate pe forumuri și site-uri lucrează cu documentul curent. De regulă, acest lucru este suficient. Dar dacă trebuie să procesați mai multe documente? Aici aș dori să iau în considerare câteva aspecte legate în mod special de prelucrarea unui document inactiv.

În documentul curent (activ), programatorul poate accesa toate capabilitățile lisp, inclusiv metode de comandă, crearea interactivă a seturilor de primitive și metode ename și activex. Dar merită doar să sugerăm prelucrarea documentului inactiv, deoarece lista instrumentelor posibile se restrânge imediat la starea "ActiveX și practic nimic mai mult".

Înainte de a continua, vă reamintesc că AutoCAD trebuie tradus într-un mod multidocumentat (variabila de sistem SDI este 0).

Prima dorinta este sa scrieti un fisier scr (probabil programabil) prin algoritm: deschideti fisierul, incarcati fisierul, executati lispul, salvati fisierul, deschideti urmatorul, etc; și executați-l pentru executare. Ce e în neregulă cu această abordare? Ei bine, cel puțin prin faptul că fișierele procesate pot fi foarte grele, timpul pentru descoperirea și regenerarea lor poate merge nemeryano. În interiorul fișierelor, de exemplu, pot fi găsite obiecte proxy. Sau va exista o solicitare de a găsi fișierul shx (cum să scapi de această solicitare, vom vorbi mai târziu). Sau altceva ... Pe scurt, va trebui să stau lângă computer și să aștept până termină scenariul. Nu, e plictisitor.

A treia opțiune este să urci destul de adânc în jungla AutoCAD și să deschizi fișierul dwg fără să îl activezi. Pe asta aș vrea să mă opresc.

ObjectDBX nu a apărut cu mult timp în urmă, iar înregistrarea sa la începutul existenței sale era diferită de cea utilizată în versiunile ultimei perioade.

Deoarece apelul ObjectDBX depinde direct de versiunea AutoCAD, determinați mai întâi versiunea:

După obținerea versiunii de rulare a programului AutoCAD, puteți încerca deja să apelați ObjectDBX:

Ei bine, interfața însăși este recepționată. Și apoi ce? Și apoi iată ce:

În prezent, cele mai interesante metode sunt Open and SaveAs (și nu Salvare, paradoxal cum pare). Este timpul să vorbim despre modul în care ObjectDBX funcționează, ce limitări are și cum să o ocolească.

Problema deschiderii unui dosar nu poate fi ridicată:

# 40; vla - deschideți numele de fișier odbx # 41;

Dar cu prelucrarea și conservarea nu este atât de evidentă.

Există doar un singur lucru: rețineți că fișierul este salvat numai în versiunea curentă și numai prin metoda SaveAs:

Bună ziua Alexey, spune-mi vă rog, și este posibil să folosiți interfața IAxDbDocument (sau ObjectDBX) atunci când lucrați cu un document inactiv, să creați în acest document unele primitive. Dacă este posibil, spune-mi cum. Eu personal nu am reușit.

(vla-AddCircle odbx (vlax-3D-point "(0 0 0)) 100)
; Eroare: Serverul ActiveX a returnat o eroare: nume necunoscut: AddCircle

Dacă vă uitați la lista de metode și proprietăți disponibile, obțineți după cum urmează:
(vlax-dump-Object odbx t),
Există doar 8 metode disponibile și niciuna dintre ele nu vă permite să creați un primitiv într-un document inactiv.

Bine. Compara:
(vla-AddCircle odbx (vlax-3D-point "(0 0 0)) 100)
și
(vlax-AddCircle (vla-get-ModelSpace odbx)) (vlax-3D-point (0 0 0)
Un inițial nu poate fi creat într-un document. Primitivul creat este situat în spațiu - model, foaie, bloc ...

Da, nu pentru ceea ce sunt aici cu aceeași problemă cu care se confruntă - mama nu-și face rău. Dacă există o soluție garantată de lucru, o voi împărți.

Aș dori să fac un mic plus.
În ceea ce privește aceasta este posibilitatea de a "deschide prin ObjectDBX un fișier blocat". În prezent, folosesc vl-file-systime pentru a verifica disponibilitatea fișierului pentru deschidere (funcția revine la zero dacă fișierul este deschis de cineva). Dacă fișierul nu este disponibil, îl copiez în% temp% și îl deschid de acolo.
Nu foarte elegant, dar funcționează. Până în prezent, cel puțin ...

Salutări, Alexey.
Nu îmi spuneți cum să sunați corespunzător vla-ZoomExtents după ce ați creat un obiect într-un document inactiv

(vla-ZoomExtents (vlax-get-acad-object)) - a fost aplicată numai în fișierul curent deschis
(vla-get-activedocument (vlax-get-acad-object)))) - a fost aplicată numai în fișierul curent deschis

(vla-ZoomExtents (vla-get-ModelSpace odbx)); = Serverul ActiveX a returnat eroarea: nume necunoscut: ZoomExtents [cc lang = "lisp"]

În opinia mea, acest lucru nu se face într-un document inactiv. În același mod, precum și să nu se execute în documentul inactiv vla-purgeall.
De ce să măriți un document inactiv?

Designerii au dorit să proceseze automat fișierele DWG primite de la Revit, pentru a fi transferate către subcontractanții care lucrează în AutoCAD.
1. reparați toate straturile într-o culoare gri neutră
2. Treceți la aspect
3. Dezactivați toate straturile pentru fiecare ecran (vplayer / freeze)
4. scrieți pe desenul din marginea ecranului (dintr-un motiv oarecare, când vine de la Revit, desenul nu este înscris în marginea ecranului)

pare să rezolve folosind un script ca în Răspuns # 4

>> Recolorează toate straturile ...
Nu este o problemă
>> comutați la aspect
Treceți sau activați astfel încât să fie afișat pe ecran când este deschis? Și dacă treci, atunci smochinul? Via vla-get-block, astfel încât să puteți ajunge la descrierea unității de foi și să lucrați cu ea ca și cu un bloc normal
>> dezactivați toate straturile pentru fiecare ecran (vplayer / freeze)
Nu sunt sigur că acest lucru se va întâmpla, dar totuși: umblați prin toate primitivele descrierii blocului foaie, găsiți VE, obțineți indici pe ele și continuați să faceți chimie cu ei.
>> Completați desenul în marginea ecranului (dintr-un motiv oarecare, când vine de la Revit, desenul nu este înscris în marginea ecranului)
În desen sau în CE? Diferența este un pic de bază. Dacă al doilea (și RE există deja), atunci trebuie să ne uităm la scara sa, să schimbăm coordonatele punctului la care indică, etc.
Din moment ce nu am pus niciodată astfel de sarcini în fața mea, nu am soluții gata făcute

Alexey, mulțumesc pentru răspunsuri!
Odată cu revopsirea straturilor, am stăpânit deja
Cu tema de a lucra cu documente inactive pentru prima dată.
Mi sa părut că este o abordare mai corectă (decât prin scenarii) dacă este nevoie să procesați o mulțime de desene.
Voi specifica în continuare afirmația problemei ...

Alexei, aș dori să clarific, pot folosi vl-cmdf într-un document inactiv? Și dacă poți, atunci ce structură va scrie echipa? Dacă înțeleg corect, atunci (vl-cmdf "_CampaignName") - această structură a comenzii va funcționa numai în desenul curent?

Toate înțeleg corect, vl-cmdf va funcționa numai în documentul activ. Nu cred că nici o construcție precum vla-SendCommand va funcționa

Articole similare