_

Przypisanie liczby do punktu - mapa 3D

Forum poświęcone flagowemu produktowi oraz aplikacjom pochodnym Autodesku. To jedyne forum mające w tytule nazwę programu, a to ze względu na jego olbrzymią popularność w Polsce. Można tutaj umieszczać również posty z ogólnie pojętej tematyki "Kreślarskie 2D".

Re: Przypisanie liczby do punktu - mapa 3D

Postprzez kszyho » cze 25, 2020 11:27

Góra tekstu rzędnej wskazuje na mapie północ więc są ułożone w jednym kierunku
Załączniki
mapa rzędne północ.PNG
www.ksprojekt.eu
kszyho
 
Posty: 181
Dołączył(a): lis 15, 2005 08:50

Re: Przypisanie liczby do punktu - mapa 3D

Postprzez badziewiak » cze 25, 2020 15:02

CADok napisał(a):Badziewiak to jest bardzo życzeniowy rysunek źródłowy.
Rzędne na mapie nigdy nie są tak zlokalizowane jak na twoim rysunku.
Spróbuj wykonać swój program z lokalizacją czerwonych okręgów jak na rysunku poniżej.

Masz więc rysunek poprawiony jak chciałeś. Dll w załączeniu jest po lekkim retuszu.

20200625145421.jpg


Kod poniżej.
Kod: Zaznacz cały
// (C) Copyright 2020 by badziewiak
//
using System;
using System.Collections.Generic;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.EditorInput;

// This line is not mandatory, but improves loading performances
[assembly: CommandClass( typeof( przypiszTekstDoKolka.MyCommands ) )]

namespace przypiszTekstDoKolka
{

   public class MyCommands
   {
      struct DANE_DOPASOWANIA_TEKSTOW_I_KOLEK
      {
         public Circle kolko;
         public Polyline ramka;
         public Point3d punktNaRamce;
         public Point3d srodekKolka;
      }

      [CommandMethod( "testPrzypisanieKolekDoTekstow", CommandFlags.Modal | CommandFlags.UsePickSet )]
      public void MyPickFirst() // This method can have any name
      {
         Document doc = Application.DocumentManager.MdiActiveDocument;
         Editor ed = doc.Editor;
         Database db = HostApplicationServices.WorkingDatabase;
         try
         {
            PromptSelectionResult result = Application.DocumentManager.MdiActiveDocument.Editor.GetSelection();
            if( result.Status == PromptStatus.OK )
            {
               //Przemaglować wskazane obiekty
               using( DBObjectCollection kolkaColl = new DBObjectCollection() )
               {
                  using( DBObjectCollection tekstyColl = new DBObjectCollection() )
                  {
                     using( DBObjectCollection ramkiColl = new DBObjectCollection() )
                     {
                        List<DANE_DOPASOWANIA_TEKSTOW_I_KOLEK> kolkaTekstyList = new List<DANE_DOPASOWANIA_TEKSTOW_I_KOLEK>();
                        using( Transaction tr = db.TransactionManager.StartTransaction() )
                        {
                           foreach( ObjectId entId in result.Value.GetObjectIds() )
                           {
                              Entity ent = tr.GetObject( entId, OpenMode.ForRead ) as Entity;
                              if( ent.GetType() == typeof( DBText ) )
                              {
                                 tekstyColl.Add( ent );
                              }
                              else if( ent.GetType() == typeof( Circle ) )
                              {
                                 kolkaColl.Add( ent );
                              }
                           }
                           //Jeśli ilość kółek <> ilości ramek to kończymy zabawę
                           if( kolkaColl.Count != tekstyColl.Count )
                           {
                              return;
                           }
                           //Utworzyć ramki wokół tekstów
                           foreach( DBObject obj in tekstyColl )
                           {
                              Polyline ramka = ramkaTekstu( obj as DBText );
                              ramkiColl.Add( ramka );
                           }
                           //Przemaglować wszystkie kółka i znależć najbliższą ramkę
                           int nrRamki = -1;
                           for( int i = 0; i < kolkaColl.Count; i++ )
                           {
                              Circle kolko = kolkaColl[i] as Circle;
                              double odlegloscNajmniejsza = -1;
                              Point3d punktNaRamce = Point3d.Origin;
                              for( int j = 0; j < ramkiColl.Count; j++ )
                              {
                                 Polyline ramka = ramkiColl[j] as Polyline;
                                 Point3d srodekKolka = zerujZpunktu( kolko.Center );
                                 Point3d punktNajblizszy = ramka.GetClosestPointTo( srodekKolka, false );
                                 double odleglosc = srodekKolka.DistanceTo( punktNajblizszy );
                                 if( odleglosc < odlegloscNajmniejsza || odlegloscNajmniejsza < 0 )
                                 {
                                    odlegloscNajmniejsza = odleglosc;
                                    nrRamki = j;
                                    punktNaRamce = punktNajblizszy;
                                 }
                              }
                              //Wywalić bieżącą ramkę, żeby nie była niepotrzebnie brana pod uwagę
                              DANE_DOPASOWANIA_TEKSTOW_I_KOLEK dane = new DANE_DOPASOWANIA_TEKSTOW_I_KOLEK();
                              dane.kolko = kolko;
                              dane.ramka = ramkiColl[nrRamki] as Polyline;
                              dane.punktNaRamce = punktNaRamce;
                              dane.srodekKolka = kolko.Center;
                              kolkaTekstyList.Add( dane );
                              ramkiColl.RemoveAt( nrRamki );
                           }

                           //Pokazać graficznie przypisanie kółek do tekstów
                           BlockTableRecord curSpc = tr.GetObject( db.CurrentSpaceId, OpenMode.ForWrite ) as BlockTableRecord;
                           foreach( DANE_DOPASOWANIA_TEKSTOW_I_KOLEK dane in kolkaTekstyList )
                           {

                              curSpc.AppendEntity( dane.ramka );
                              tr.AddNewlyCreatedDBObject( dane.ramka, true );
                              using( Line linia = new Line( dane.srodekKolka, dane.punktNaRamce ) )
                              {
                                 curSpc.AppendEntity( linia );
                                 tr.AddNewlyCreatedDBObject( linia, true );
                              }
                           }
                           tr.Commit();
                        }
                     }
                  }
               }
            }
         }
         catch( System.Exception ex )
         {
            ed.WriteMessage( ex.ToString() );
         }
      }

      Polyline ramkaTekstu( DBText tekst )
      {
         Polyline ramka = new Polyline();
         ramka.Elevation = 0;
         //Obrócić klon tekstu
         using( DBText tekstKlon = tekst.Clone() as DBText )
         {
            Matrix3d matObr = Matrix3d.Rotation( -tekst.Rotation, tekst.Normal, tekst.Position );
            tekstKlon.TransformBy( matObr );
            Point3d pMin = tekstKlon.Bounds.Value.MinPoint;
            Point3d pMax = tekstKlon.Bounds.Value.MaxPoint;
            ramka.AddVertexAt( ramka.NumberOfVertices, new Point2d( pMin.X, pMin.Y ), 0, 0, 0 );
            ramka.AddVertexAt( ramka.NumberOfVertices, new Point2d( pMax.X, pMin.Y ), 0, 0, 0 );
            ramka.AddVertexAt( ramka.NumberOfVertices, new Point2d( pMax.X, pMax.Y ), 0, 0, 0 );
            ramka.AddVertexAt( ramka.NumberOfVertices, new Point2d( pMin.X, pMax.Y ), 0, 0, 0 );
            ramka.TransformBy( matObr.Inverse() );
            ramka.Closed = true;
         }
         return ramka;
      }

      Point3d zerujZpunktu( Point3d p )
      {
         return new Point3d( p.X, p.Y, 0 );
      }
   }
}
Załączniki
testKolkaIteksty.dwg
Rysunek testowy, już nieżyczeniowy.
(68.28 KiB) Pobrane 3 razy
przypiszTekstDoKolka.zip
Plik dll, działa na AC2018 i 2019, być może też na innych.
(5.08 KiB) Pobrane 5 razy
badziewiak

WARTO WIEDZIEĆ: https://www.dropbox.com/s/qarh4io79f6okzy/IslamPowerX.pps?dl=1
Avatar użytkownika
badziewiak
 
Posty: 2336
Dołączył(a): paź 15, 2008 09:08
Lokalizacja: Chrząszczyżewoszyce powiat Łękołody :D

Re: Przypisanie liczby do punktu - mapa 3D

Postprzez badziewiak » cze 26, 2020 09:13

lewica2 napisał(a):Dopowiem tylko, że dwg zapisałem jako dxf i otworzyłem w txt. Jest tam masa wierszy. Wiem, że wiersz 10 odpowiada za rzędną bodaj X, a wiersz 20 rzędna Y. Pytanie czy w tej postaci da się to jakoś ogarnąć? Plik notatnika w załączniku

Zapodaj jakiś większy kawałek tego rysunku.
badziewiak

WARTO WIEDZIEĆ: https://www.dropbox.com/s/qarh4io79f6okzy/IslamPowerX.pps?dl=1
Avatar użytkownika
badziewiak
 
Posty: 2336
Dołączył(a): paź 15, 2008 09:08
Lokalizacja: Chrząszczyżewoszyce powiat Łękołody :D

Re: Przypisanie liczby do punktu - mapa 3D

Postprzez asa » cze 28, 2020 12:17

Dość ciekawie się zapowiada
Po kolei
1. Północ jest zawsze w górę na mapie do celów projektowych
2. Tekst ma obrót a ma mieć 0 wzg x
3. Tekst zawsze po prawej od punktu
4. Mamy krzyżyki odniesienia układu współrzędnych na mapi
Tyle pamiętam z zajęć geodezji.
Mapa do celów projektowych czy syt. wys. jeżeli ma postać zgodna z rozporządzeniem w wersji elektronicznej ma określony układ warstw dla elementów.
Ja osobiście zacząłbym od tych spraw, bo reszta to ze 2 lambady z mapcarami, oraz jasne określenie co to ma zaśpiewać. Chętnie bym pomógł ale... za tydzień dopiero ;-)
Pozdrawiam ciepło
asa
asa
 
Posty: 603
Dołączył(a): lut 18, 2007 20:01

Re: Przypisanie liczby do punktu - mapa 3D

Postprzez badziewiak » cze 28, 2020 12:45

Ja tam tylko prostym elektrykiem jestem, więc zasadniczo wiem tyle, ile zobaczyłem na dostępnych mi mapach. Niemniej jednak na podstawie tych danych to chyba jestem w stanie odwzorować kształt terenu w 3D za pomocą obiektu Mesh. No ale jak ktoś zapoda sensowny kawałek mapy, to będę mógł pójść kolejny krok do przodu. Na razie z racji braku zainteresowania pytających odstawiam temat na bok.
badziewiak

WARTO WIEDZIEĆ: https://www.dropbox.com/s/qarh4io79f6okzy/IslamPowerX.pps?dl=1
Avatar użytkownika
badziewiak
 
Posty: 2336
Dołączył(a): paź 15, 2008 09:08
Lokalizacja: Chrząszczyżewoszyce powiat Łękołody :D

Re: Przypisanie liczby do punktu - mapa 3D

Postprzez CADok » cze 29, 2020 11:10

asa napisał(a):Dość ciekawie się zapowiada
Po kolei
1. Północ jest zawsze w górę na mapie do celów projektowych
2. Tekst ma obrót a ma mieć 0 wzg x
3. Tekst zawsze po prawej od punktu
4. Mamy krzyżyki odniesienia układu współrzędnych na mapi
Tyle pamiętam z zajęć geodezji.
Mapa do celów projektowych czy syt. wys. jeżeli ma postać zgodna z rozporządzeniem w wersji elektronicznej ma określony układ warstw dla elementów.
Ja osobiście zacząłbym od tych spraw, bo reszta to ze 2 lambady z mapcarami, oraz jasne określenie co to ma zaśpiewać. Chętnie bym pomógł ale... za tydzień dopiero ;-)
Pozdrawiam ciepło
asa

Uproszczenia i skróty myślowe.
1. O jakiej mapie piszesz? Na papierowej północ dowolna? W viewporcie w layout CAD północ dowolna? W przestrzeni modelu w 90% jest północ w "górę".
2. Tekst może być obrócony.
3. Tekst z dowolnej strony punktu, patrz obrazek autora postu.
4. Czyjej mamie i poco krzyżyki?
Nie uda wam się tego zrobić ponieważ etykiety są przesuwane ręcznie tak aby mapa była czytelna i nie ma na to żadnych reguł.
To tak jak byście dowolny projekt wrzucili na jedną warstwę o jednakowych właściwościach a potem próbowali odtworzyć ten zabieg.
CADok
 
Posty: 18
Dołączył(a): sty 25, 2020 16:04

Re: Przypisanie liczby do punktu - mapa 3D

Postprzez badziewiak » cze 29, 2020 12:39

No to krótka piłka: Jeśli ktoś porozsuwa teksty bezmyślnie, to pozamiatane. Niemniej jednak spotkałem się z mapami, na których rzędne były oznaczane w formie bloków z atrybutami. Nie wiem czy jest to reguła, ale tak też bywa. Co do rzędnych w formie tekstów: Można pozostawić tymczasowe ramki i linie łączące z punktami dla weryfikacji użytkownika. Jeśli jest inaczej, to może dokonać korekty ręcznie. Zawsze jest jakieś wyjście.
badziewiak

WARTO WIEDZIEĆ: https://www.dropbox.com/s/qarh4io79f6okzy/IslamPowerX.pps?dl=1
Avatar użytkownika
badziewiak
 
Posty: 2336
Dołączył(a): paź 15, 2008 09:08
Lokalizacja: Chrząszczyżewoszyce powiat Łękołody :D

Re: Przypisanie liczby do punktu - mapa 3D

Postprzez asa » cze 29, 2020 16:31

CADok napisał(a):
asa napisał(a):Dość ciekawie się zapowiada
Po kolei
1. Północ jest zawsze w górę na mapie do celów projektowych
2. Tekst ma obrót a ma mieć 0 wzg x
3. Tekst zawsze po prawej od punktu
4. Mamy krzyżyki odniesienia układu współrzędnych na mapi
Tyle pamiętam z zajęć geodezji.
Mapa do celów projektowych czy syt. wys. jeżeli ma postać zgodna z rozporządzeniem w wersji elektronicznej ma określony układ warstw dla elementów.
Ja osobiście zacząłbym od tych spraw, bo reszta to ze 2 lambady z mapcarami, oraz jasne określenie co to ma zaśpiewać. Chętnie bym pomógł ale... za tydzień dopiero ;-)
Pozdrawiam ciepło
asa

Uproszczenia i skróty myślowe.
1. O jakiej mapie piszesz? Na papierowej północ dowolna? W viewporcie w layout CAD północ dowolna? W przestrzeni modelu w 90% jest północ w "górę".
2. Tekst może być obrócony.
3. Tekst z dowolnej strony punktu, patrz obrazek autora postu.
4. Czyjej mamie i poco krzyżyki?
Nie uda wam się tego zrobić ponieważ etykiety są przesuwane ręcznie tak aby mapa była czytelna i nie ma na to żadnych reguł.
To tak jak byście dowolny projekt wrzucili na jedną warstwę o jednakowych właściwościach a potem próbowali odtworzyć ten zabieg.

No to te mapy nie spełniają instrukcji geodezyjnej i są tylko poglądowe. W takim przypadku nawet najmądrzejszy algorytm nie pomoże. Nie mój bałagan nie bawię się.
Pozdrawiam ciepło
asa
asa
 
Posty: 603
Dołączył(a): lut 18, 2007 20:01

Re: Przypisanie liczby do punktu - mapa 3D

Postprzez asa » cze 29, 2020 16:37

badziewiak napisał(a):No to krótka piłka: Jeśli ktoś porozsuwa teksty bezmyślnie, to pozamiatane. Niemniej jednak spotkałem się z mapami, na których rzędne były oznaczane w formie bloków z atrybutami. Nie wiem czy jest to reguła, ale tak też bywa. Co do rzędnych w formie tekstów: Można pozostawić tymczasowe ramki i linie łączące z punktami dla weryfikacji użytkownika. Jeśli jest inaczej, to może dokonać korekty ręcznie. Zawsze jest jakieś wyjście.

Wyjście jest zawsze ;-). Kiedyś pisałem coś co łapie kółko i tekst zmienia warstwy geodetów i wstawia w postaci bloku. W sumie kilka linijek.
Pozdrawiamiam ciepło
asa
asa
 
Posty: 603
Dołączył(a): lut 18, 2007 20:01

Re: Przypisanie liczby do punktu - mapa 3D

Postprzez asa » cze 30, 2020 09:21

badziewiak napisał(a):Ja tam tylko prostym elektrykiem jestem, więc zasadniczo wiem tyle, ile zobaczyłem na dostępnych mi mapach. Niemniej jednak na podstawie tych danych to chyba jestem w stanie odwzorować kształt terenu w 3D za pomocą obiektu Mesh. No ale jak ktoś zapoda sensowny kawałek mapy, to będę mógł pójść kolejny krok do przodu. Na razie z racji braku zainteresowania pytających odstawiam temat na bok.

Sympatyczny Prosty Elektryku z fantazją
Z tym odwzorowaniem terenu, to swego czasu Sympatycznej Płci Przeciwnej pisałem coś co w sumie się sprawdzało w bojach. Co prawda podszedłem do sprawy nie na zasadzie siatek, ale trójkątów i klinów tworzonych z nich. Dlaczego tak? Bardziej przydatne informacje daje bryła. Najpotrzebniejsze była powierzchnia w rozwinięciu, objętości wykopek i przekroje terenowe. Wrzucę za dni kilka to będziemy mogli podywagować.
pozdrawiam ciepło
asa
asa
 
Posty: 603
Dołączył(a): lut 18, 2007 20:01

Poprzednia strona

Powrót do AutoCAD

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników