Il Bar dell'Ingegneria

Quoto: dal Sanscrito al DXF

« Older   Newer »
 
  Share  
.
  1.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,169
    Reputation
    +294

    Status
    Offline
    In questo topic intendo raccogliere quanto sono riuscito a comprendere per la scrittura di una linea di quotatura all'interno di un file dxf, invitando al contributo coloro che sanno come si sono svolti i fatti.

    cvAZz2N
     
    Top
    .
  2.     +1   -1
     
    .
    Avatar

    Member

    Group
    Member
    Posts
    766
    Reputation
    +23

    Status
    Offline
    Io non mi sono cimentato nel reverse engineering delle quotature di autocad, ma posso suggerire una libreria open source che già lo fà:
    CITAZIONE
    libdxfrw

    libdxfrw is a free C++ library to read and write DXF files in both formats, ascii and binary form.
    It is licensed under the terms of the GNU General Public License version 2 (or at you option
    any later version).


    If you are looking for general information about the project, check our website:
    http://sourceforge.net/projects/libdxfrw
     
    Top
    .
  3.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,169
    Reputation
    +294

    Status
    Offline
    Intendo inserire un rigo nella "consolle DXF per excel" in cui sono contenuti i dati necessari per la scrittura della linea di dimensione all'interno del file dxf (e successiva lettura da parte del CAD).

    Il rigo di partenza è il seguente:

    eTpReSf

    a cui aggiungerò ulteriori dati qualora si rendessero necessari.
    Il parametro "dist" rappresenta la distanza a cui porre la linea di dimensione dal segmento che congiunge i punti A e B.

    Qui mi rendo già conto che necessiterebbe un qualche indicatore per distinguere una linea di quotatura posta sul semipiano positivo o su quello negativo (per intenderci meglio: "sopra" o "sotto" il segmento AB) individuati dalla retta AB. Per adesso non me ne occupo pensando che forse basta cambiare il segno del parametro "dist" per ottenere la distinzione.

    Servirebbe anche un indicatore per la posizione del testo di misura (se "sopra" o "sotto" la linea di quota), ma anche qui per adesso non me ne occupo.

    CITAZIONE (texitaliano64 @ 16/9/2014, 13:00) 
    Io non mi sono cimentato nel reverse engineering delle quotature di autocad, ma posso suggerire una libreria open source che già lo fà:
    CITAZIONE
    libdxfrw

    libdxfrw is a free C++ library to read and write DXF files in both formats, ascii and binary form.
    It is licensed under the terms of the GNU General Public License version 2 (or at you option
    any later version).


    If you are looking for general information about the project, check our website:
    http://sourceforge.net/projects/libdxfrw

    Tengo in considerazione il link che hai dato ma penso per adesso di non impelagarmi anche nella traduzione dell'Aramaico per capire come scrivere il mio codice. Mi complicherebbe i pochi geroglifici che sono riuscito a decifrare.
     
    Top
    .
  4.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Member
    Posts
    2,942
    Reputation
    +187

    Status
    Offline
    Riprendiamo il discorso....

    Dunque, come detto in altri post, la quota viene vista da Autocad alla stessa stregua di un blocco.
    Essa infatti è costituita dall'insieme delle seguenti primitive:

    1) Linea di estensione iniziale
    2) Linea di estensione finale
    3) Linea di quota vera e propria
    4) Freccia di estremità iniziale
    5) Freccia di estremità finale
    6) Puntino 'caldo' iniziale
    7) Puntino 'caldo' finale
    8) Testo di quota propriamente detto

    Come blocco va pertanto definita non nella sezione ENTITIES dove sono ubicati tutte le nostre primitive di disegno, ma purtroppo va prima definita nella sezione BLOCKS, e quindi richiamata con il comando INSERT nella sezione ENTITES.

    Il nome che le quote, intese come blocchi, devono avere è un nome speciale, affinchè Autocad capisca che non si tratta di un blocco qualsiasi, ma proprio di una quota.
    Tutti i blocchi quota sono quindi nominati con: *Dxxx (dove al posto di xxx c'è un numero intero: 1, 2, 1000, ecc.)

    Purtroppo, proprio perchè blocchi 'particolari', nella sezione ENTITIES non possiamo limitarci ad indicare il nome del blocco da inserire, il layer, ed il punto di inserimento del blocco stesso, ma dobbiamo dare delle informazioni aggiuntive.

    In sintesi, dal mio reverse engineering di parecchi anni fa (ma che bel nome! Non pensavo avessi fatto questa fantastica operazione allora), emerge che se definisco il blocco di una quota 'lunga' 100 unità di disegno, quando la vado a richiamare nella sezione ENTITES, oltre a dover specificare il punto di inserimento, devo nuovamente indicare i punti iniziali e finali della quota (relativi questa volta al punto di inserimento indicato). E se questi non mi restituiscono una lunghezza pari a 100 unità di disegno, la quota non viene disegnata ed Autocad si rifiuta di procedere.

    Aggiungo anche, ma di questo non sono sicuro, che in ogni caso non è possibile inserire nel disegno due volte un blocco quota definito univocamente dal suo nome *Dxxx, pur variando di volta in volta il suo punto di inserimento e mettendo i dati 'giusti' nella sezione ENTITIES.
     
    Top
    .
  5.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,169
    Reputation
    +294

    Status
    Offline
    CITAZIONE (zax2013 @ 16/9/2014, 13:29) 
    Riprendiamo il discorso....

    Dunque, come detto in altri post, la quota viene vista da Autocad alla stessa stregua di un blocco.
    Essa infatti è costituita dall'insieme delle seguenti primitive:

    1) Linea di estensione iniziale
    2) Linea di estensione finale
    3) Linea di quota vera e propria
    4) Freccia di estremità iniziale
    5) Freccia di estremità finale
    6) Puntino 'caldo' iniziale
    7) Puntino 'caldo' finale
    8) Testo di quota propriamente detto

    Come blocco va pertanto definita non nella sezione ENTITIES dove sono ubicati tutte le nostre primitive di disegno, ma purtroppo va prima definita nella sezione BLOCKS, e quindi richiamata con il comando INSERT nella sezione ENTITES.

    Il nome che le quote, intese come blocchi, devono avere è un nome speciale, affinchè Autocad capisca che non si tratta di un blocco qualsiasi, ma proprio di una quota.
    Tutti i blocchi quota sono quindi nominati con: *Dxxx (dove al posto di xxx c'è un numero intero: 1, 2, 1000, ecc.)

    Purtroppo, proprio perchè blocchi 'particolari', nella sezione ENTITIES non possiamo limitarci ad indicare il nome del blocco da inserire, il layer, ed il punto di inserimento del blocco stesso, ma dobbiamo dare delle informazioni aggiuntive.

    In sintesi, dal mio reverse engineering di parecchi anni fa (ma che bel nome! Non pensavo avessi fatto questa fantastica operazione allora), emerge che se definisco il blocco di una quota 'lunga' 100 unità di disegno, quando la vado a richiamare nella sezione ENTITES, oltre a dover specificare il punto di inserimento, devo nuovamente indicare i punti iniziali e finali della quota (relativi questa volta al punto di inserimento indicato). E se questi non mi restituiscono una lunghezza pari a 100 unità di disegno, la quota non viene disegnata ed Autocad si rifiuta di procedere.

    Aggiungo anche, ma di questo non sono sicuro, che in ogni caso non è possibile inserire nel disegno due volte un blocco quota definito univocamente dal suo nome *Dxxx, pur variando di volta in volta il suo punto di inserimento e mettendo i dati 'giusti' nella sezione ENTITIES.

    Tutto questo lo avevo capito (anche perchè me lo avevi spiegato chiaramente) ed anche riscontrato nelle diverse prove di scrittura dxf partendo da disegno autocad. Leggendo poi il dxf ho appunto visto la presenza di quanto hai spiegato.
    Intendo tuttavia riportare passo dopo passo il tutto.

    Quindi, riassumendo, una linea di quota si divide in due parti:
    - la parte scritta nella sezione ENTITIES
    - la parte scritta nella sezione BLOCKS


    Per ogni linea di quota presente nel disegno devono essere scritte entrambe le parti.

    La parte che deve essere scritta nella sezione ENTITIES si riferisce alla figura che segue:

    7oeUm4j

    In questa immagine intendo che :
    le coordinate del punto P0 vanno scritte nei codici 10,20 e 30
    le coordinate del punto P1 vanno scritte nei codici 11,21 e 31
    le coordinate del punto P3 vanno scritte nei codici 13,23 e 33
    le coordinate del punto P4 vanno scritte nei codici 14,24 e 34

    Per il significato dei punti, il disegno è abbastanza esplicativo, mentre sottolineo che P1 rappresenta il centro del testo della misura.

    A questo punto è utile riportare i codici di campo necessari per scrivere la parte della line adi dimensione nella sezione ENTITIES

    CODICE
    0
    DIMENSION

     8 ' codice di campo relativo al layer
    0

     2 ' codice di campo relativo al blocco di riferimento della quota
    *D1 ' nome del blocco della quota definito nella sezione BLOCKS

    10
    P0.x
    20
    P0.y
    30
    P0.z

    11
    P1.x
    21
    P1.y
    31
    P1.z

    70 ' codice del tipo di linea di dimensione
        1 ' 1= allineata; 0= orizzontale o verticale o inclinata

    13
    P3.x
    23
    P3.y
    33
    P3.z

    14
    P4.x
    24
    p4.y
    34
    P4.z


    Nelle varie prove ho visto che il codice 70 viene sempre inframezzato tra i punti P0 P1 e i punti P3 P4. Non ho idea di cosa succede se si scrive il codice 70 in posizione diversa. Per adesso non mi pongo il problema.

    La lista dei valori possibili e del loro significato relativi al codice di gruppo 70 è la seguente:

    ImqKEL9

    Inoltre aggiungo che è possibile inserire anche altri codici di gruppo finalizzati, per esempio, al colore, allo spessore, al tratteggio ecc ecc. Quella che ho presentato è la struttura minima da scrivere nella sezione ENTITIES per ottenere il disegno di una linea di quota.
     
    Top
    .
  6.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,169
    Reputation
    +294

    Status
    Offline
    Perfetto.Ci servono quindi quattro punti ma di questi due li abbiamo già. Le cose si semplificano, basta quindi determinarsi le coordinate del punto P0 e del punto P1.

    Queste sono facilmente determinabili conoscendo l'angolo formato dalla retta AB con l'orizzontale ma conviene cercare formule che non coinvolgono funzioni trigonometriche per evitare problemi quando A e B stanno sulla stessa verticale.

    p5Uaggh

    Indicando con D la distanza tra i punti A e B da quotare, con Dx e Dy le sue componenti facilmente determinabili tramite differenza di omologhe coordinate
    indicando con d la distanza (nota) a cui porre la linea di quota e con dx e dy le sue componenti (incognite)

    dalla similitudine tra triangoli possiamo scrivere:

    dx : Dy = dy : Dx = d : D

    da cui si ricavano:
    dx= Dy*d/D
    dy= Dx*d/D


    e quindi le coordinate del punto P0:

    P0.x= P4.x +dx
    P0.y= P4.y - dy


    in cui P4=B

    Cosa accade a queste formule se avessimo voluto porre la linea di quota dalla banda opposta dando come parametro il valore di d negativo?

    Cosa similare possiamo fare per la determinazione del punto P1 ma ci servono almeno due ulteriori parametri : l'offset rispetto alla linea di quota cui porre il testo della misura e l'altezza del testo.
     
    Top
    .
  7.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,169
    Reputation
    +294

    Status
    Offline
    CITAZIONE (afazio @ 16/9/2014, 15:04) 
    Cosa similare possiamo fare per la determinazione del punto P1 ma ci servono almeno due ulteriori parametri : l'offset rispetto alla linea di quota cui porre il testo della misura e l'altezza del testo.

    Riparto riprendendo la parte finale del mio ultimo intervento.

    3Mhjhbx

    Dare la possibilità attraverso la consolle di stabilire l'altezza del testo mi pare il minimo; devo quindi prevedere una colonna per l'altezza del testo, ma pensare di stabilire anche l'offset del testo-misura dalla linea di misura appare eccessivo.
    Ma vi sono anche altre centinaia di parametri che contribuiscono alla formazione della quotatuta automatica e li possiamo riscontrare tutti nella finestra di dialogo di Autocad che permette di fissare uno stile di quota).
    Tra questi per esempio vi sono gli offset delle linee di richiamo dai punti "caldi" (come li ha chiamati zax) o la loro estensione oltre la linea di quotatura o , ancora, la lunghezza delle freccie. Ma anche le freccie stesse costituiscono un parametro che puo' essere scelto da una lista di possibili simboli (oltre che poterne utilizzare di propri).

    atoJU1P

    Ognuno di questi parametri relativi alle linee di quota è registrato in autocad in una serie di variabili di sistema che possono essere modificati nel corso di una sessione di lavoro ma che vengono ricaricati pari a quelli standard ad ogni nuova sessione di lavoro.
    Sono tutte quella variabili che iniziano con $DIM... e che vengono definite nella sezione HEADER del dxf

    CODICE
    ...
     9
    $DIMASZ
    40
    2.5
     9
    $DIMEXO
    40
    0.625
     9
    $DIMDLI
    40
    3.75
     9
    $DIMRND
    40
    0.0
     9
    $DIMDLE
    40
    0.0
     9
    $DIMEXE
    40
    1.25
     9
    $DIMTP
    .....


    e sono un mare....

    Per esempio la variabile di sistema che si riferisce all'offset del testo di misura rispetto alla linea di misura dovrebbe essere la DIMGAP.
    Questo a noi poco importa dato che indipendentemente dal valore che abbiamo fissato (o non abbiamo fissato) nella sezione Header per queste variabili, dobbiamo comunque calcolare le coordinate dei vari punti che alla fine formano la geometria della quotatura e per calcolare abbiamo necessita di conoscere o fissare questi numeri.
    Non posso pensare di dedicare parecche decine di colonne nella consolle per dare possibilità di variare qualsiasi parametro di una quota, sarebbe da folli e poi non sto cercando di realizzare un programma CAD. Quindi fisserò secondo mio arbitrio i valori di questi parametri lasciando scegliere solo quelli essenziali.
     
    Top
    .
  8.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,169
    Reputation
    +294

    Status
    Offline
    Per adesso i parametri essenziali sono:
    - la distanza a cui porre la linea di quota rispetto ai punti da quotare
    - l'altezza del testo
    oltre, naturalmente, alle coordinate dei due punti da quotare.

    Proseguendo capiremo quali altri parametri sono necessari per comporre la quota ed allora stabilirò se dare la possibilità di sceglierli o se fissarli a mio arbitrio (ma esiste nella mia testa una terza possibilità).
    Conviene quindi passare alla parte della quota da scrivere nella sezione BLOCKS
     
    Top
    .
  9.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,169
    Reputation
    +294

    Status
    Offline
    Nella figura che segue sono riportati tutti gli elementi che compongono il blocco relativo alla quotatura allineata munita di freccette alle estremità:

    KefjpC8

    In particolare occorre scrivere i seguenti dati:

    - coordinate del punti di inserimento del blocco che poniamo pari a 0;0;0 per evitare i calcoli in coordinate oggetto (OCS). Con questa posizione tutte le coordinate saranno assolute anche quelle che per contratto Autodesk devono essere riferite ad un sistema diverso dal WCS.
    A tal proposito riporto uno stralcio del manuale di riferimento del DXF R12:

    wKtvCvY

    poi occorre scrivere le seguenti entità:
    tre entità punto ( i punti "caldi" di zax) nel layer DEFPOINT
    - POINT (a)
    - POINT (b)
    - POINT (c)

    tre entità linea
    - LINE (d)
    - LINE (e)
    - LINE (f)

    due entità freccette
    - SOLID (g)
    - SOLID (h)

    una entità blocco di testo
    - INSERT (i)
     
    Top
    .
  10.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Member
    Posts
    3,345
    Reputation
    +213

    Status
    Offline
    CITAZIONE (afazio @ 17/9/2014, 10:49) 
    Proseguendo capiremo quali altri parametri sono necessari per comporre la quota ed allora stabilirò se dare la possibilità di sceglierli o se fissarli a mio arbitrio (ma esiste nella mia testa una terza possibilità).

    ad esempio, io stabilirei (internamente alla consolle) un valore di offset legato all'altezza del testo, qualcosa tipo 2/3 dell'altezza o il 50% o quello che graficamente risulta più gradevole, senza obbligare l'utente a inserire troppi parametri.
     
    Top
    .
  11.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,169
    Reputation
    +294

    Status
    Offline
    CITAZIONE (reversi @ 17/9/2014, 11:16) 
    CITAZIONE (afazio @ 17/9/2014, 10:49) 
    Proseguendo capiremo quali altri parametri sono necessari per comporre la quota ed allora stabilirò se dare la possibilità di sceglierli o se fissarli a mio arbitrio (ma esiste nella mia testa una terza possibilità).

    ad esempio, io stabilirei (internamente alla consolle) un valore di offset legato all'altezza del testo, qualcosa tipo 2/3 dell'altezza o il 50% o quello che graficamente risulta più gradevole, senza obbligare l'utente a inserire troppi parametri.

    Questo significa fissarlo all'interno del codice ed è praticamente quello che farò dato che ho necessita di questi numeri per poter calcolare le coordinate dei vari punti.

    Stavo pensando ad una cosa del genere:
    stabilire delle variabili globali all'interno del codice che contengono i valori da me fissati per tutti quei parametri necessari per la determinazione della geometria.
    In questo modo posso sempre entrare nel codice e variare una sola volta il valore di un determinato parametro. Ma cosi facendo posso anche dare la possibilità di variare il gruppo di questi parametri attraverso un rigo della consolle.
     
    Top
    .
  12.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,169
    Reputation
    +294

    Status
    Offline
    Prima di passare all'esame dei vari elementi che compongono il blocco relativo alla quotatura, vediamo in cosa consiste quell'elemento INSERT.

    Questo altro non è che il riferimento ad altro blocco e nello specifico al blocco che riporta il teso di misura.
    Quindi l'entità INSERT dovrà fare riferimento ad un nome di blocco che è stato già definito o che sarà definito a seguire.
    Come per il nome dei blocchi relativi alle quotature anche i blocchi relativi al testo di misura da inserire tramite INSERT nel blocco quotatura devono avere un nome particolare del tipo "*UXXX" in cui XXX è un numero progressivo.

    B8Q5WLw

    Il blocco relativo al testo di misura si compone dei seguenti dati:

    0 --> codice di inizio blocco
    BLOCK

    8 ---> codice di gruppo del layer
    0 ---> nome del layer

    2 ---> codice di gruppo del nome del blocco
    *U3 ---> nome del blocco

    70 --> codice relativo al tipo di blocco
    1 --> valore (nel caso di blocchi interni per la definizione di dimensioni questo valore deve essere impostato ad 1

    Ecco lo stralcio del manuale di riferimento DXF R12

    An5v2pB

    seguono le coordinate del punto di inserimento. Queste devono essere uguali a quelle del punto di inserimento del blocco dimensione
    10
    0.0
    20
    0.0
    30
    0.0

    3 ---> si ripete il nome del blocco
    *U3 ---> nome del blocco

    1 ---> Xref path name
    ---> (lasciato vuoto)

    Seguono le entità che compongono il blocco "testo di misura"

    0--> codice dell'entità
    TEXT -->tipo di entità

    5 ---> ID esadecimale unico
    1BF

    8 --> Layer
    0

    62 --> colore
    0

    le coordinate del punto P di inizio del testo (quello che ho indicato nell'immagine)
    10
    Px
    20
    Py
    30
    Pz

    40 --> codice altezza del testo
    10.0

    1 -- Codice relativo al testo da scrivere, quindi la misura
    420,59

    50 ----> inclinazione del testo
    18.004161605913371

    0 --> Codice di fine blocco
    ENDBLK

    5 ---> ID esadecimale unico di fine blocco
    1C1

    8 ---> layer di fine blocco
    0

    Praticamente anche la fine di un blocco per autocad rappresenta una entità
     
    Top
    .
  13.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,169
    Reputation
    +294

    Status
    Offline
    Vediamo adesso nel dettaglio gli elementi da scrivere nel blocco della linea di quotatura

    Nell'immagine che segue riporto uno stralcio con alcuni degli elementi.

    tfCd5UQ

    Per quanto riguarda i tre punti "caldi" (a), (b) e (c), li abbiamo già: i primi due sono i punti che intendiamo quotare mentre il terzo è il punto P0 che avevo determinato per la scrittura della parte ENTITIES della quotatura.

    Per il segmento (d) abbiamo necessita di calcolare le coordinate dei punti 1 e 2 e per poterlo fare ci servono i due offset:
    - offset della linea di richiamo dal punto caldo
    - offset della linea di richiamo oltre la linea di quotatura.

    noti questi possiamo ricorrere alle medesime formule scritte precedentemente.
    Indicando con Off1 il primo offset e con Off2 il secondo, e con A il punto caldo, abbiamo:

    punto 1:

    1.x = A.x + Dy*Off1/D
    1.y = A.y - Dx*Off1/D

    Punto 2

    2.x = A.x + Dy*(d+Off2)/D
    2.y = A.y - Dx*(d+Off2)/D

    in cui d e D sono rispettivamente la distanza a cui porre la linea di quota e la distanza tra i due punti che intendiamo misurare.
    Dx e Dy sono le componenti di D

    Quindi sono sempre le stesse formule e per questo potrebbe tornare utile scrivere unica funzione .
     
    Top
    .
  14.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,169
    Reputation
    +294

    Status
    Offline
    Dall'altro lato della quotatura si ripropone la stessa situazione, la differenza sta nel punto caldo da prendere in considerazione che stavolta è il punto B:

    bSKvAGY

    le formule relative alle coordinate degli estremi del segmento (e) diventano:

    punto 11:

    11.x = B.x + Dy*Off1/D
    11.y = B.y - Dx*Off1/D

    Punto 12

    12.x = B.x + Dy*(d+Off2)/D
    12.y = B.y - Dx*(d+Off2)/D

    come si puo' vedere, fino adesso nulla di complicato.

    Per la scrittura del segmento (f) ci servono i punti 6 e 7 che dipendono da altro parametro che dobbiamo fissare e cioè dalla lunghezza della freccetta.
    L'altezza della freccetta sarebbe un ulteriore parametro ma dalle prove condotte ho visto che Autocad stabilisce per questo simbolo una altezza complessiva pari ad 1/3 della lunghezza.

    J1YxRAJ

    Possiamo determinare le coordinate del punto 6 a partire da quelle del punto 5 (che dobbiamo comunque calcolare per il disegno della freccetta) e le coordinate del punto 7 a partire da quelle del punto 10 (che abbiamo calcolato dato che questo coincide col punto P0 determinato per la scrittura della parte ENTITIES.

    punto 5:

    5.x = A.x + Dy*d/D
    5.y = A.y - Dx*d/D

    Punto 10

    10.x = B.x + Dy*d/D
    10.y = B.y - Dx*d/D

    Ed ancora nulla di complicato e sopratutto abbiamo utilizzato sempre la stessa unica formula.

    Ponendo con
    Lfr la lunghezza della freccetta, abbiamo:

    punto 6

    6.x = 5.x +Dx*Lfr/D
    6.y = 5.y +Dy*Lfr/D

    punto 7

    7.x = 10.x -Dx*Lfr/D
    7.y = 10.y -Dy*Lfr/D

    e con questo abbiamo definito pure la linea di quota.

    Passiamo alle due freccette, elementi (g) ed (h).

    C3fzIhb

    Per disegnarle Autocad usa la primitiva SOLID che prima di adesso sconoscevo. Per capire di cosa si tratta basta digitare nel rigo di comando di autocad _SOLID.
    Autocad chiederà in sequenza quattro punti e quindi disegnerà un quadrilatero semplice o intrecciato in funzione di dove avete fatto click interamente riempito con il retino solid e nel colore che avete scelto come default.

    Per simulare una freccetta basta far coincidere il terzo ed il quarto punto di questo quadrilatero.

    Per disegnarlo servono quindi i punti 3 4 e 5 di cui il 5 già noto.

    Possiamo calcolare i punti 3 e 4 appoggiandoci al punto 6 che abbiamo già determinato

    punto 3:

    3.x = 6.x - Dy*(Lfr/6)/D
    3.y = 6.y + Dx*(Lfr/6)/D

    Punto 4

    4.x = 3.x + Dy*(Lfr/3)/D
    4.y = 3.y - Dx*(Lfr/3)/D

    Stessa cosa ma con punto di appoggio differente vale per la freccetta destra.

    Rimane da determinare il punto 13 per poter piazzare il testo nel blocco *UXXX

    e qui ho un piccolo problema. Necessita la lunghezza del testo che dipende da quello che faremo scrivere.
    Infatti non è detto che si debba scrivere per forza la misura della distanza tra A e B, possiamo anche decidere di far sovrascrivere la misura con un testo a nostro piacimento. Quanto sarà lungo in mm il testo?
    Se fossimo in ambiente VBA con l'ausilio delle funzioni della libreria pubblicata da Autocad la cosa sarebbe semplicissima; basta far scrivere il testo in una posizione arbitraria chiedere quanto è lungo, cancellare il testo e riscriverlo nella posizione voluta conoscendone la lunghezza. Ma qui non abbiamo questa possibilità.

    Risolta in qualche modo quest'ultima questione, in definitiva abbiamo la necessità di determinare le coordinate di 14 punti; i 13 che ho illustrato adesso ed il quattordicesimo è il centro del testo di misura necessario per scrivere la parte Entities della quotatura.
    Possiamo pensare di dedicare unica sub che li determina tutti in una botta passandogli tutti i parametri necessari e quini poter scrivere sia la parte BLOCK sia la parte ENTITIES della linea di dimensione.

    Ma esiste un ma.

    La parte Entities deve essere scritta dopo aver chiuso la sezione Blocks. Stiamo scrivendo un file in maniera sequenziale e non possiamo lasciare aperta la sezione blocks, scrivere una entità nella sezione Entities e poi tornare a scrivere nella sezione Block.
     
    Top
    .
  15.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,169
    Reputation
    +294

    Status
    Offline
    Da questa analisi siamo in grado di determinare tutti i punti necessari per scrivere il nostro dxf, tranne uno: quello che stabilisce l'inizio del testo misura.

    Ho condotto delle ricerche in internet con la parola chiave "VBA Text Width". Ho trovato un sacco di 3D in cui viene posto il quesito ma in nessun caso viene data una risposta conclusiva, tranne in uno che devo ancora valutare e che se non da la risposta al problema della lunghezza di un testo disegnato in autocad fornisce almeno un metodo per determinare la lunghezza di un testo in pixel in una cella excel.

    Per non perdere la risposta riporto qui il codice della funzione che hanno postato:

    CODICE
    Dim mafChrWid(32 To 127) As Double ' widths of printing characters
    Dim msFontName  As String ' font name having these widths

    Function StrWidth(s As String, sFontName As String, fFontSize As Double) As Double
        ' Returns the approximate width in points of a text string
        ' in a specified font name and font size
       
        ' Does not account for kerning
       
       Dim i       As Long
       Dim j       As Long
       
       If Len(sFontName) = 0 Then Exit Function
       If sFontName <> msFontName Then
           If Not InitChrWidths(sFontName) Then Exit Function
       End If
       
       For i = 1 To Len(s)
           j = Asc(Mid(s, i, 1))
           If j >= 32 Then
               StrWidth = StrWidth + fFontSize * mafChrWid(j)
           End If
       Next i
    End Function

    Function InitChrWidths(sFontName As String) As Boolean
       Dim i       As Long
       
       Select Case sFontName
       Case "Arial"
           For i = 32 To 127
               Select Case i
               Case 39, 106, 108
                   mafChrWid(i) = 0.1902
               Case 105, 116
                   mafChrWid(i) = 0.2526
               Case 32, 33, 44, 46, 47, 58, 59, 73, 91 To 93, 102, 124
                   mafChrWid(i) = 0.3144
               Case 34, 40, 41, 45, 96, 114, 123, 125
                   mafChrWid(i) = 0.3768
               Case 42, 94, 118, 120
                   mafChrWid(i) = 0.4392
               Case 107, 115, 122
                   mafChrWid(i) = 0.501
               Case 35, 36, 48 To 57, 63, 74, 76, 84, 90, 95, 97 To 101, 103, 104, 110 To 113, 117, 121
                   mafChrWid(i) = 0.5634
               Case 43, 60 To 62, 70, 126
                   mafChrWid(i) = 0.6252
               Case 38, 65, 66, 69, 72, 75, 78, 80, 82, 83, 85, 86, 88, 89, 119
                   mafChrWid(i) = 0.6876
               Case 67, 68, 71, 79, 81
                   mafChrWid(i) = 0.7494
               Case 77, 109, 127
                   mafChrWid(i) = 0.8118
               Case 37
                   mafChrWid(i) = 0.936
               Case 64, 87
                   mafChrWid(i) = 1.0602
               End Select
           Next i
           
       Case "Consolas"
           For i = 32 To 127
               Select Case i
               Case 32 To 127
                   mafChrWid(i) = 0.5634
               End Select
           Next i
           
       Case "Calibri"
           For i = 32 To 127
               Select Case i
               Case 32, 39, 44, 46, 73, 105, 106, 108
                   mafChrWid(i) = 0.2526
               Case 40, 41, 45, 58, 59, 74, 91, 93, 96, 102, 123, 125
                   mafChrWid(i) = 0.3144
               Case 33, 114, 116
                   mafChrWid(i) = 0.3768
               Case 34, 47, 76, 92, 99, 115, 120, 122
                   mafChrWid(i) = 0.4392
               Case 35, 42, 43, 60 To 63, 69, 70, 83, 84, 89, 90, 94, 95, 97, 101, 103, 107, 118, 121, 124, 126
                   mafChrWid(i) = 0.501
               Case 36, 48 To 57, 66, 67, 75, 80, 82, 88, 98, 100, 104, 110 To 113, 117, 127
                   mafChrWid(i) = 0.5634
               Case 65, 68, 86
                   mafChrWid(i) = 0.6252
               Case 71, 72, 78, 79, 81, 85
                   mafChrWid(i) = 0.6876
               Case 37, 38, 119
                   mafChrWid(i) = 0.7494
               Case 109
                   mafChrWid(i) = 0.8742
               Case 64, 77, 87
                   mafChrWid(i) = 0.936
               End Select
           Next i
           
       Case "Tahoma"
           For i = 32 To 127
               Select Case i
               Case 39, 105, 108
                   mafChrWid(i) = 0.2526
               Case 32, 44, 46, 102, 106
                   mafChrWid(i) = 0.3144
               Case 33, 45, 58, 59, 73, 114, 116
                   mafChrWid(i) = 0.3768
               Case 34, 40, 41, 47, 74, 91 To 93, 124
                   mafChrWid(i) = 0.4392
               Case 63, 76, 99, 107, 115, 118, 120 To 123, 125
                   mafChrWid(i) = 0.501
               Case 36, 42, 48 To 57, 70, 80, 83, 95 To 98, 100, 101, 103, 104, 110 To 113, 117
                   mafChrWid(i) = 0.5634
               Case 66, 67, 69, 75, 84, 86, 88, 89, 90
                   mafChrWid(i) = 0.6252
               Case 38, 65, 71, 72, 78, 82, 85
                   mafChrWid(i) = 0.6876
               Case 35, 43, 60 To 62, 68, 79, 81, 94, 126
                   mafChrWid(i) = 0.7494
               Case 77, 119
                   mafChrWid(i) = 0.8118
               Case 109
                   mafChrWid(i) = 0.8742
               Case 64, 87
                   mafChrWid(i) = 0.936
               Case 37, 127
                   mafChrWid(i) = 1.0602
               End Select
           Next i
           
       Case "Lucida Console"
           For i = 32 To 127
               Select Case i
               Case 32 To 127
                   mafChrWid(i) = 0.6252
               End Select
           Next i
           
       Case "Times New Roman"
           For i = 32 To 127
               Select Case i
               Case 39, 124
                   mafChrWid(i) = 0.1902
               Case 32, 44, 46, 59
                   mafChrWid(i) = 0.2526
               Case 33, 34, 47, 58, 73, 91 To 93, 105, 106, 108, 116
                   mafChrWid(i) = 0.3144
               Case 40, 41, 45, 96, 102, 114
                   mafChrWid(i) = 0.3768
               Case 63, 74, 97, 115, 118, 122
                   mafChrWid(i) = 0.4392
               Case 94, 98 To 101, 103, 104, 107, 110, 112, 113, 117, 120, 121, 123, 125
                   mafChrWid(i) = 0.501
               Case 35, 36, 42, 48 To 57, 70, 83, 84, 95, 111, 126
                   mafChrWid(i) = 0.5634
               Case 43, 60 To 62, 69, 76, 80, 90
                   mafChrWid(i) = 0.6252
               Case 65 To 67, 82, 86, 89, 119
                   mafChrWid(i) = 0.6876
               Case 68, 71, 72, 75, 78, 79, 81, 85, 88
                   mafChrWid(i) = 0.7494
               Case 38, 109, 127
                   mafChrWid(i) = 0.8118
               Case 37
                   mafChrWid(i) = 0.8742
               Case 64, 77
                   mafChrWid(i) = 0.936
               Case 87
                   mafChrWid(i) = 0.9984
               End Select
           Next i
           
       Case Else
           MsgBox "Font name """ & sFontName & """ not available!", vbCritical, "StrWidth"
           Exit Function
       End Select
       msFontName = sFontName
       InitChrWidths = True
    End Function

    col commento:

    Re: Calculate Text Width In Points
    Perhaps this will work for you. It returns string widths in points for Arial, Consolas, Calibri, Tahoma, Lucida Console, and Times New Roman fonts. Example usage:

    = StrWidth("Hello, World", "Arial", 10) (returns 55.78).

    Prima di avventurarmi all'esame in dettaglio di questo codice per poterlo adottare, annoto due cose fondamentali che mi bloccano:

    - la funzione restituisce la lunghezza del testo espresso in PIXEL. Ammesso che le dimensioni di un testo stampato in una cella sono uguali a quello stampato in un disegno Autocad, come faccio poi a trasformare i PIXEL in mm?

    - la funzione vuole il font utilizzato, e questo mi sembra logico dato che la lunghezza del testo dipende dal font, ma in autocad attraverso la scrittura di un DXF posso utilizzare il font che autocad chiama txt.shx (1) e questo font non è nella lista dei font previsti dalla funzione (anche se presente nella lista dei font utilizzabili in excel).

    (1)Mi è piaciuta la nota a pie commento di Reversi. Questa nota per specificare che da prove condotte anche creando uno stile di testo nel DXF con font diverso dal Txt.shx, autocad legge sempre il font Txt.shx.
    Addirittura facendo la prova a comporre un disegno con diversi tesi scritti nei font più disparati, salvando il file in formato dxf e facendolo poi rileggere da Autocad, tutti i testi vengono riscritti nell'unico font Txt.
     
    Top
    .
27 replies since 16/9/2014, 11:11   773 views
  Share  
.