perlon

Użytkownik forum
  • Zawartość

    289
  • Rejestracja

  • Ostatnia wizyta

  • Wygrane w rankingu

    19

Zawartość dodana przez perlon

  1. Witam. Po lekturze ostatniego wpisu Kojacka na jego blogu chciałem sprawdzić działanie c:dim-sf na ZwCAD, który krzyknął że nie zna takiej funkcji jak w temacie. Czy jest w ZwCAD jakiś odpowiednik lispowiej funkcji (getpropertyvalue). To samo dotyczy funkcji setpropertyvalue, dumpallproperties i ispropertyreadonly. Ewentualnie czy są plany ich wprowadzenia?
  2. Jeden wiersz tabeli to jeden obiekt (encja)? Inaczej mówiąc ile kresek w zaznaczonym zbiorze to tyle wierszy w tabelce? A jeżeli na jednej warstwie jest kilka kresek w tym samym kolorze to co ma być w tabelce?
  3. No i kruszyński był szybszy Dodam tylko, że jeżeli obiekt ma kolor bylayer to kodu 62 może w ogóle w encji nie być.
  4. (progn (repeat (setq i (sslength ss)) (setq e (ssname ss (setq i (1- i))) a (cdr (assoc 8 (entget e))) ; odczyt nazwy warstwy obiektu d (vlax-curve-getdistatparam e (vlax-curve-getendparam e)) ; odczyt dlugosci obiektu ) (if (setq o (assoc a l)) ; jezeli warstwa jest juz na liscie (setq l (subst (list a (+ (cadr o) d)) o l)) ; dodaj dlugosc elementu do lacznej dlugosci obiektow warstwy (setq l (cons (list a d) l)) ; dodaj pare warstwa dlugosc do listy warstw ) ) problem polega na tym, że długości obiektów na poszczególnych warstwach da się sumować ale nie da się sumować ich kolorów 😉 tak więc prosta przeróbka tego lispa raczej nie wchodzi w grę. Jak miałaby wyglądać ta tabelka? warstwa1 -> kolor1 -> ilość1 warstwa1 -> kolor3 -> ilość3 warstwa2 -> kolor1 -> ilość1 warstwa2 -> kolor2 -> ilość2 warstwa2 -> kolor5 -> ilość5 etc. ???
  5. Czy są plany wprowadzenia tej zmiennej systemowej? Brak filtrowania obiektów przy obrocie trochę zamula sam proces obracania.
  6. perlon

    Zmienna systemowa ORBITAUTOTARGET

    W SP2 beta nie zostało to poprawione.
  7. perlon

    Wymiar z podziałem na "n" cześci

    Trzeba jeszcze było uodpornić lispa na DIMRND=0 bo wywalał dzielenie przez 0. I jeszcze zamiana kropki na znak oddzielenia części dziesiętnej wg stylu wymiarowego. Wersja po poprawkach: (vl-load-com) (defun c:dimagregatemod ( / ent) (while (= nil ent) (progn (prompt "\nWskaz wymiar do zmiany: ") (setq ent (car (entsel))) ) ) (if (= (cdr (assoc 0 (entget ent))) "DIMENSION") (pr:multipledimsection (entget ent)) (princ "\nBlad: Wskazany obiekt nie jest wymiarem liniowym") ) (princ) ) (defun c:dimagregate ( / ) (command "_dimlinear" pause pause pause) (pr:multipledimsection (entget (entlast))) (princ) ) (defun pr:multipledimsection ( entlist / n section newtext rnd) (setq n (getint "\nPodaj liczbe odcinkow: ") section (/ (float (cdr (assoc 42 entlist))) (float n)) rnd (getvar "DIMRND") ) (if (not (= rnd 0)) (setq section (* rnd (atoi (rtos (/ section rnd) 2 0)))) ) (setq newtext (strcat "<>\\X(" (itoa n) "x" (vl-string-translate "." (getvar "DIMDSEP") (rtos section 2 (getvar "DIMDEC"))) ")") entlist (subst (cons 1 newtext) (assoc 42 entlist) entlist) ) (entmod entlist) ) (princ)
  8. perlon

    Wymiar z podziałem na "n" cześci

    voila (defun c:dimagregatemod ( / ent entlist) (while (= nil ent) (progn (prompt "\nWskaz wymiar do zmiany: ") (setq ent (car (entsel))) ) ) (if (= (cdr (assoc 0 (entget ent))) "DIMENSION") (pr:multipledimsection (entget ent)) (princ "\nBlad: Wskazany obiekt nie jest wymiarem liniowym") ) (princ) ) (defun c:dimagregate ( / ) (command "_dimlinear" pause pause pause) (pr:multipledimsection (entget (entlast))) (princ) ) (defun pr:multipledimsection ( entlist / n section newtext) (setq n (getint "\nPodaj liczbe odcinkow: ") section (* (getvar "DIMRND") (atoi (rtos (/ (/ (float (cdr (assoc 42 entlist))) (float n)) (getvar "DIMRND")) 2 0))) newtext (strcat "<>\\X(" (itoa n) "x" (rtos section 2 (getvar "DIMDEC")) ")") entlist (subst (cons 1 newtext) (assoc 42 entlist) entlist) ) (entmod entlist) ) (princ)
  9. perlon

    Wymiar z podziałem na "n" cześci

    Zapewne jest możliwe, ale nie wiem jak odczytać tę właściwość. UNITS daje takie okno: W autocad jest coś takiego jak -DWGUNITS (polecenie zewnętrzne w arx) ale w ZwCAD nie zadziała. Nie wiem jaka zmienna trzyma aktualną jednostkę rysunkową. Nic innego w temacie jednostek mi nie przychodzi do głowy, chyba że nakładki, ale to inna bajka bo każda nakładka trzyma jednostki po swojemu.
  10. perlon

    Wymiar z podziałem na "n" cześci

    W między czasie jak jeszcze mogłem posta zedytować dorzuciłem warunek sprawdzający czy faktycznie wskazany obiekt jest wymiarem czego nie ma w podlinkowanym pliku lsp: ;c:ww1() ;[...] (if (= (cdr (assoc 0 (entget ent))) "DIMENSION") (multipledimsection (entget ent)) (princ "\nBlad: Wskazany obiekt nie jest wymiarem liniowym") )
  11. perlon

    Wymiar z podziałem na "n" cześci

    A co mi tam. Napisałem rybę. Mi się też przyda (defun c:ww1 ( / ent) (while (= nil ent) (progn (prompt "\nWskaz wymiar do zmiany: ") (setq ent (car (entsel))) ) ) (if (= (cdr (assoc 0 (entget ent))) "DIMENSION") (multipledimsection (entget ent)) ) ) (defun c:ww2 ( / ) (command "_dimlinear" pause pause pause) (multipledimsection (entget (entlast))) ) (defun multipledimsection ( entlist / n section newtext) (setq n (getint "\nPodaj liczbe odcinkow: ") section (/ (cdr (assoc 42 entlist)) n) newtext (strcat "<>\\X(" (itoa n) "x" (rtos section 2 2) ")") entlist (subst (cons 1 newtext) (assoc 42 entlist) entlist) ) (entmod entlist) (princ) ) (princ)
  12. perlon

    Wymiar z podziałem na "n" cześci

    Taka wędka do samodzielnej przeróbki na rybę 😉 (defun c:ww ( / ent n entlist dimvalue section newtext) (while (= nil ent) (progn (prompt "\nWskaz wymiar do zmiany: ") (setq ent (car (entsel))) ) ) (setq n (getint "\nPodaj liczbe odcinkow: ") entlist (entget ent) section (/ (cdr (assoc 42 entlist)) n) newtext (strcat "<>\\X(" (itoa n) "x" (rtos section 2 2) ")") entlist (subst (cons 1 newtext) (assoc 42 entlist) entlist) ) (entmod entlist) (princ) )
  13. Pisanie lispa bezpośrednio do okna komend to raczej słabe jest. Żadnych szans na poprawki. Zrób kolego tak: 1. Otwórz jakiś edytor tekstowy (notatnik, notepad++, cokolwiek) 2, Wpisz coś takiego (command "Line" (getpoint) (getpoint) (getpoint) (getpoint) "c") 3. Zapisz jako : d:\moj_lisp.lsp d:\ jest przykładową lokalizacją ty wybierz sobie jaką tam chcesz, moj_lisp.lsp jest nazwą pliku LSP który należy wczytać do zwcad'a. Też możesz wybrać cokolwiek byle miało rozszerzenie .LSP 4. W linii komend w zwcad'zie wpisz (load "d:\moj_lisp.lsp") 5. Wskaż cztery punkty zgodnie z podpowiedzią w linii komend 6. Masz swój pierwszy program w LISP'ie rysujący czworokąt z obiektów typu linia o wskazanych wierzchołkach 7. Wpisz do powyższego pliku taką sekwencję (setq p1 (getpoint "Wskaz punkt:")) (setq p2 (polar p1 0 100)) (setq p3 (polar p2 (/ PI 2) 100)) (setq p4 (polar p3 PI 100)) (command "Line" p1 p2 p3 p4 "c") 8. Zapisz i załaduj ponownie do zwcad'a Masz lispa który rysuje kwadrat. W pliku moj_lisp.lsp możesz dopisywać kolejne komendy, polecenia, funkcje które złożą się na jakąś sekwencję dającą oczekiwany efekt. Możesz na forum wrzucić co masz już napisane, to dasz szansę, żeby ci pomóc.
  14. Nie mówię, że się podejmę, ale chciałbym zwrócić uwagę że brakuje kilku wymiarów i wydaje mi się, że podane zależności wymiarowe na rysunku uniemożliwiają prawidłowe wykonstruowanie tego kształtu. Brakuje rozstawu wybrań na dolnej krawędzi i wysięgu wypustu. Pomijając to geometrycznie to lipa jest. Jeżeli założymy (w przybliżeniu) R = b/3 to ( b/3 - 5 ) + b/3 + b/3 + ( b/3 - 5 ) = 4b/3 - 10 = b -> b = 30; R=10 U góry jest to jedynie rozwiązanie a widać. że na dole nie da się upchnąć dwóch wybrań o promieniu R=b/3=10 nie mówiąc już o wypuście. Musisz chyba jeszcze raz przemyśleć zadanie. Oczywiście, jest możliwość, że się mylę, ale w takim razie tym bardziej nie jestem w stanie ci pomóc.
  15. A może to ci się nada https://kojacek.wordpress.com/2018/05/17/numerator/
  16. Należałoby najpierw uściślić czy chodzi ci o wstążkę czyli z angielska ribbon w stylu wstążkowym interfejsu, Czy może jednak menu rozwijanie z interfejsu klasycznego to co pokazałeś na własnym zrzucie ekranu. Kwestia semantyki. Jeżeli to pierwsze to trzeba się bawić edytorem plików .cui (Tools->Customize->Customize interface) Jeżeli to drugie to poszukaj w googlu hasła autocad custom menu pull-down; i polecenia menuload Tutaj masz co nieco o tworzeniu własnego menu. https://www.afralisp.net/archive/lispa/menu1.htm http://www.thirdistudio.com.au/AutoCADmenu1.html no i oficjalna strona autodesku https://knowledge.autodesk.com/support/autocad-lt/learn-explore/caas/CloudHelp/cloudhelp/2019/ENU/AutoCAD-LT/files/GUID-90B274D0-C750-4ADA-9D3E-2C07B157F6A3-htm.html Większość nakładek ma jakieś swoje menu. Można podejrzeć jak to jest zrobione np. w Profilku naszego kolegi forumowego Gruzin albo w nakładkach e-cad. Każde takie menu siedzi w pliku *.mnu Zdaje się, że nowe wersje zwcada nie mają już tego pliku ale w wersji 2015+ taki plik jest w kartotece {user}\AppData\Roaming\ZWSOFT\ZWCAD\2015\en-US\Support Można go sobie pooglądać i zrobić coś a'la w podobie.
  17. perlon

    C# Hatch

    Znalazłem. hatch.AppendLoop(HatchLoopTypes.External, collection); enum HatchLoopTypes można sumować logicznie hatch.AppendLoop(HatchLoopTypes.External | HatchLoopTypes.Outermost, collection);
  18. perlon

    C# Hatch

    Wygląda na to, że hund begraben jest w kodzie DXF 92. Po wstawieniu hatcha z .NET API kod wynosi 0. Sprawdziłem że dla kodu 1 jest liczona powierzchnia. Dla innych nie sprawdzałem. Wyciąg z dokumentacji kodów DXF Boundary Path Data The boundary of each hatch object is defined by a path (or loop) that consists of one or more segments. Path segment data varies depending on the entity type (or types) that make up the path. Each path segment is defined by its own set of group codes. For information about abbreviations and formatting used in this table, see Formatting Conventions in This Reference on page 2. Hatch boundary path data group codes Description Group code Boundary path type flag (bit coded): 92 0 = Default; 1 = External; 2 = Polyline 4 = Derived; 8 = Textbox; 16 = Outermost Lekarstwo w lisp'ie. (defun c:hatchfix ( / entity dxfdata old-dxf new-dxf dxfdata ) (setq entity (car (entsel)) dxfdata (entget entity) old-dxf (assoc 92 dxfdata) new-dxf '(92 . 1) dxfdata (subst new-dxf old-dxf dxfdata) ) (entmod dxfdata) ) W C# jeszcze nie znalazłem co i jak trzeba zafiksować żeby DXF 92 był 1.
  19. Witam Czy jest możliwe przechwycenie zdarzenia zmiany skali komendą _.CANNOSCALE? Testowałem Eventhandler CommandEnded ale on wysyła CommandEventArgs tylko z jednym polem : GlobalCommandName. Pole to zawiera jednak w tym przypadku jako nazwę komendy "SETVAR". Tak więc przechwytując zdarzenie CommandEnded co najwyżej dowiem się się, że była wykonana komenda SETVAR. A chciałbym wiedzieć czy była to komenda CANNOSCALE. Jak to zrobić? Może istnieje jakieś inne zdarzenie wywoływane przy okazji komendy CANNOSCALE?
  20. Zgadza się. Ten Eventhandler jest bardziej precyzyjny. Dzięki.
  21. perlon

    Palety narzędzi - tworzenie, edycja

    Chodziło mi o _toolpalettes. Te XML'e są dla mnie pogmatwane i myślałem, że jest do tego jakiś pomocnik no i API, żeby to wczytać programowo bez angażowania użytkownika. Co do własnych palet to zdążyłem po informacji od Parikona doczytać i z grubsza uruchomić klasę PaletteSet. Jak się okazuje można tam wsadzić nie tylko WPF. WindowsForms doskonale w niej chodzi. Gdzieś widziałem nawet Javę. Wcześniej nie wiedziałem jak tego użyć a teraz mam nową zabawkę do zabawy
  22. perlon

    Przybornik PARIKON

    Mógłbyś pokazać jak stworzyć własną paletę i jak wbiłeś kontrolkę WPF do takiej palety? Może jakiś link z materiałami do poczytania?
  23. perlon

    Palety narzędzi - tworzenie, edycja

    Czy istnieje jakaś specyfikacja techniczna palety w ZwCAD'zie? Chodzi mi manual z opisem struktury pliku i ewentualnie jakiś user guide jak takie palety tworzyć. Czy istnieje jakieś API do tego aby w sposób programowy zaimportować własną paletę np z pozioomu ActivX lub .NET'a?
  24. Witam. Zderzyłem się z programistycznym problemem niekoniecznie związanym ściśle z ZwCAD'em ale wyszedł akurat przy programie na tą platformę. Prawdopodobnie jest to problem bardziej ogólny. Mam klasę generyczną która ma za zadanie sprawdzić czy w tablicy symboli istnieje przekazany symbol. Jeżeli nie to powinna ten symbol w tej tablicy utworzyć. public abstract class SymbolGenerator<TTable> : ISymbolGenerator where TTable : SymbolTable { public abstract void Generate(); public void Generate<TSymbol>(TSymbol symbol) where TSymbol : SymbolTableRecord { Document acDoc = Application.DocumentManager.MdiActiveDocument; Database acDatabase = acDoc.Database; using (Transaction transaction = acDoc.TransactionManager.StartTransaction()) { TTable symbolTable = (TTable)transaction.GetObject(GetObjectId(acDatabase, typeof(TTable)), mode: OpenMode.ForRead); if (!symbolTable.Has(symbol.Name)) { symbolTable.Add(symbol); // <- tu się wywala transaction.AddNewlyCreatedDBObject(symbol, true); transaction.Commit(); } } } private ObjectId GetObjectId(Database db, Type type) { switch(type.Name) { case "LayerTable": return db.LayerTableId; case "TextStyleTable": return db.TextStyleTableId; default: throw new NotSupportedException(); } } } Jak widać klasa powinna sobie poradzić z każdą tablicą symboli. Mnie w szczególności interesują LayerTable i TextStyleTable. Po przekazaniu innej ma rzucić wyjątek. Klasa jest abstrakcyjna więc potrzebuję klasy konkretnej. Przykładowa klasa do obsługi jakiegoś stylu tekstu. Klasa dziedziczy po SymbolGenerator<TextStyleTable> jak widać oczekuje typu TextStyleTable public class ElevationMarkTextStyleGenerator : SymbolGenerator<TextStyleTable>, IElevationMarkTextStyleGenerator { public override void Generate() { TextStyleTableRecord style = new TextStyleTableRecord(); style.Name = "ck_koty"; style.FileName = "simplex.shx"; style.XScale = 0.65; style.ObliquingAngle = 0; Generate(style); } } Wywołanie proste: var generator = new ElevationMarkTextStyleGenerator(); generator.Generate(); Application does not support just-in-time (JIT) debugging. See the end of this message for details. ************** Exception Text ************** System.Runtime.InteropServices.SEHException (0x80004005): External component has thrown an exception. at ZcDbSymbolTable.add(ZcDbSymbolTable* , ZcDbObjectId* , ZcDbSymbolTableRecord* ) at ZwSoft.ZwCAD.DatabaseServices.SymbolTable.Add(SymbolTableRecord value) at CADKitCore.Contract.SymbolGenerator`1.Generate[TSymbol](TSymbol symbol) in D:\dev\CSharp\Workspace\CADKit\CADKit\Contract\SymbolGenerator.cs:line 21 at CADKitElevationMarks.Model.ElevationMarkTextStyleGenerator.Generate() in D:\dev\CSharp\Workspace\CADKit\CADKitElevationMarks\Model\ElevationMarkTextStyleGenerator.cs:line 17 at CADKitElevationMarks.Contract.BaseElevationMark..ctor(IElevationMarkConfig _config) in D:\dev\CSharp\Workspace\CADKit\CADKitElevationMarks\Contract\BaseElevationMark.cs:line 44 at CADKitElevationMarks.Model.ArchtecturalElevationMarkPNB01025..ctor(IElevationMarkConfig config) in D:\dev\CSharp\Workspace\CADKit\CADKitElevationMarks\Model\ArchtecturalElevationMarkPNB01025.cs:line 16 at CADKitElevationMarks.Model.ElevationMarkFactoryPNB01025.GetElevationMark(ElevationMarkType type, IElevationMarkConfig config) in D:\dev\CSharp\Workspace\CADKit\CADKitElevationMarks\Model\ElevationMarkFactoryPNB01025.cs:line 15 at CADKitElevationMarks.Contract.ElevationMarkFactory.GetElevationMark(ElevationMarkType type) in D:\dev\CSharp\Workspace\CADKit\CADKitElevationMarks\Contract\ElevationMarkFactory.cs:line 15 at CADKitElevationMarks.Commands.ElevationMarkArch() in D:\dev\CSharp\Workspace\CADKit\CADKitElevationMarks\Commands.cs:line 17 at ZwSoft.ZwCAD.Runtime.CommandClass.InvokeHelper(MethodInfo mi, Object commandObject, Boolean bLispFunction) at ZwSoft.ZwCAD.Runtime.CommandClass.InvokeHelperWithExceptionFilter(MethodInfo mi, Object commandObject, Boolean bLispFunction) Prawdę mówiąc nie wiem co robię nie tak. Może znajdzie się ktoś bieglejszy, kto mi to wyjaśni?
  25. Tiaaaa.... proszę admina o wywalenie wątku w niebyt. Jeżeli nie to sam sobie odpowiem. Ślepota własna. Nie odblokowałem tablicy do zapisu. TTable symbolTable = (TTable)transaction.GetObject(GetObjectId(acDatabase, typeof(TTable)), mode: OpenMode.ForRead); // <- tylko do odczytu if (!symbolTable.Has(symbol.Name)) { symbolTable.UpgradeOpen(); // <- togo brakowało symbolTable.Add(symbol); transaction.AddNewlyCreatedDBObject(symbol, true); transaction.Commit(); }