_

zbiór wskazań zaznaczony polilinią

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: zbiór wskazań zaznaczony polilinią

Postprzez z » maja 16, 2011 17:10

badziewiak napisał(a):Dzieki, za chwile przetestuje. Powiedz tylko, jak mam podmienic vla-put-TextString %1 (itoa st) tak, zeby dodac z przodu wolny tekst, np. ABC.

badziewiak używa lisp... Koniec świata...
z
z
 
Posty: 1950
Dołączył(a): cze 16, 2009 22:49

Re: zbiór wskazań zaznaczony polilinią

Postprzez badziewiak » maja 16, 2011 17:19

z napisał(a):
badziewiak napisał(a):Dzieki, za chwile przetestuje. Powiedz tylko, jak mam podmienic vla-put-TextString %1 (itoa st) tak, zeby dodac z przodu wolny tekst, np. ABC.

badziewiak używa lisp... Koniec świata...

Wy mnie tu na zle drogi nie sprowadzicie :twisted: zaraz zrobie swojego ARXa, bedzie szybciej ;)

kojacek napisał(a):Sprawdzamy zatem, najpierw to:(...)
Dopiero jutro, rysunki mam w pracy :/
badziewiak

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

Re: zbiór wskazań zaznaczony polilinią

Postprzez badziewiak » maja 16, 2011 21:34

Zrobilem swojego ARXa. Kod ponizej (bez funkcji pomocniczych), skompilowany projekt do AC2007+ w zalaczniku. Nie wiem czy to zaleta, ale dziala na wszelakich curvach. Testowac.
Uruchomienie: Przeciagnac ARXa na ekran acada i z palca nCur.
Kod: Zaznacz cały
   static void RKUCInumeratorCurva_nCur(void)
   {
      // Add your code for command RKUCInumeratorCurva._nCur here
      acedDisableDefaultARXExceptionHandler( kTrue );
      try
      {
         //Zapytać o curvę
         AcDbEntity* wEnt = dostep::wezObiekt( L"\nWskaż curvę wzdłuż której numerować bloki: ", kForRead );
         if( wEnt == NULL )
            return;
         if( !wEnt->isKindOf( AcDbCurve::desc() ) )
         {
            acedPrompt( L"\nNie wskazano curvy!" );
            return;
         }   //if( !wEnt->isKindOf( AcDbCurve::desc() ) )
         //Curva jest - sprawdzać czy w bieżącej przestrzeni coś się przecina z curvą.
         
         //Zapytać o atrybut do numerowania
         ACHAR buf[134];
         buf[0] = NULL;
         if( acedGetString( 1, L"\nWpisz nazwę atrybutu do numerowania: ", buf ) != RTNORM || buf[0] == NULL )
         {
            return;
         }   //if( acedGetString( 1, L"\nWpisz szukaną nazwę bloku: ", buf ) != RTNORM || buf[0] == NULL )         
         AcString nazwaAtr( buf );
         
         //Zapytać o tekst przed numerem
         buf[0] = NULL;
         if( acedGetString( 1, L"\nWpisz tekst przed numerem: ", buf ) != RTNORM )
         {
            return;
         }   //if( acedGetString( 1, L"\nWpisz tekst przed numerem: ", buf ) != RTNORM )      
         AcString prefix( buf );
         
         //Zapytać o początek numeracji
         int nr = 0;
         if( acedGetInt( L"\nWpisz początek numeracji: ", &nr )!= RTNORM )
         {
            return;
         }   //if( acedGetInt( L"\nWpisz początek numeracji: ", &nr )!= RTNORM )
         
         //Zapytać o ilość znaków
         int iloscZnakow = 0;
         acedGetInt( L"\nWpisz ilość znaków: ", &iloscZnakow );
         AcDbCurve* wCurva = AcDbCurve::cast( wEnt );
         
         //Otworzyć bieżącą przestrzeń
         AcDbBlockTableRecord* curSpc = dostep::wezPrzestrzenBiezaca( kForRead );
         if( curSpc == NULL )
         {
            acdbFail( L"\nNie udało się otworzyć bieżącej przestrzeni!" );
            wCurva->close();
            return;
         }   //if( curSpc == NULL )
         
         std::wstringstream wss;
         std::wstring str;
         bPoly::MBPOLY mBPolyBlDef;   //Współrzędne def. bloków
         bPoly::BPOLY bpolyRef;
         
         typedef std::vector< double > VDBL;
         VDBL vOdleglosciNaCurvie;
         typedef std::vector< AcDbObjectId > VOBID;
         VOBID vObjIdBlokow;
         sortowanie::INDEKSY indeksy;
         
         //Badać wszystkie bloki z bieżącej przestrzeni
         AcDbBlockTableRecordIterator* wCurSpcIt = NULL;
         ErrorStatus eS = curSpc->newIterator( wCurSpcIt );
         if( eS != eOk )
         {
            acdbFail( L"\nNie udało się otworzyć bieżącej przestrzeni!" );
            curSpc->close();
            wCurva->close();
            acutPrintf( L" Kod błędu: %d", eS );
            return;
         }   //if( wBTR->newIterator( wCurSpcIt ) != eOk )
         //Otworzyć obiekt, który jest blokiem
         int i = 0;
         for( ; !wCurSpcIt->done(); wCurSpcIt->step() )
         {
            AcDbEntity* wEnt = NULL;
            AcDbObjectId oId;
            ErrorStatus eS = wCurSpcIt->getEntityId( oId );
            if( eS == eOk )
            {
               //Jeśli to curva wskazana, to ominąć, bo będzie wyjebka (otwarta jest)
               if( oId == wCurva->objectId() )
                  continue;
               //Blok?
               eS = acdbOpenAcDbEntity( wEnt, oId, kForRead );
               if( eS == eOk )
               {
                  if( wEnt->isA() == AcDbBlockReference::desc() )
                  {
                     //Blok. Sprawdzić czy przecina się z curvą. W tym celu rozbić blok.
                     AcGePoint3dArray pPrzec;
                     AcDbBlockReference* wBlokRef = AcDbBlockReference::cast( wEnt );
                     AcDbVoidPtrArray entArr;
                     ErrorStatus eS = wBlokRef->explode( entArr );
                     if( eS != eOk )
                     {
                        //Nie udało się rozbić bloku, wywalić obiekty.
                        for( int i = 0; i < entArr.length(); i++ )
                           delete entArr[i];
                        acedPrompt( L"\nNie udało się rozbić bloku!" );
                        wBlokRef->close();
                        continue;
                     }   //if( eS != eOk )
                     
                     //Udało się rozbić blok - badać przecięcie.
                     bool przecinaSie = false;
                     for( int i = 0; i < entArr.length(); i++ )
                     {
                        AcDbEntity* wEnt = (AcDbEntity*)(AcRxObject*)entArr[i];
                        if( wEnt->isKindOf( AcDbCurve::desc() ) )
                        {
                           eS = wCurva->intersectWith( wEnt, kOnBothOperands, pPrzec );
                        }   //if( wEnt->isKindOf( AcDbCurve::desc() ) )
                        if( !pPrzec.isEmpty() )
                           przecinaSie = true;   //Kontynuować, żeby wywalić wszystkie rozbite obiekty
                        delete wEnt;
                     }   //for( int i = 0; i < entArr.length(); i++ )
                     
                     if( przecinaSie )
                     {
                        //Przecina się - pobrać boundingPolyline i wyznaczyć jej środek
                        bPoly::MBPOLY::iterator it = mBPolyBlDef.find( wBlokRef->blockTableRecord() );
                        bPoly::BPOLY bpolyBlDef;   //Bounding polyline def. bloku
                        if( it == mBPolyBlDef.end() )
                        {
                           //Nie znaleziono - pobrać.
                           if( bPoly::pobierzBpolyBolkDef( wBlokRef->blockTableRecord(), bpolyBlDef, true, true ) == eOk )
                           {
                              mBPolyBlDef.insert( bPoly::PARABPOLY( wBlokRef->blockTableRecord(), bpolyBlDef ) );
                           }   //if( bPoly::pobierzBpolyBolkDef( wBlokRef->blockTableRecord(), bpoly, false, true ) == eOk )
                        }   //if( it == mBPolyBlDef.end() )
                        else
                           bpolyBlDef = it->second;   //Znaleziono
                           
                        bPoly::transformujBpolyBlDefWgBlRef( bpolyBlDef, wBlokRef->position(), wBlokRef->rotation(), wBlokRef->scaleFactors(),
                              false, bpolyRef );
                        //boundingPolyline wyznaczone - wyznaczyć środek bloku.
                        AcGePoint3d pSrodek, pClosest;
                        pSrodek.x = ( bpolyRef.pA.x + bpolyRef.pC.x ) / 2;
                        pSrodek.y = ( bpolyRef.pA.y + bpolyRef.pC.y ) / 2;
                        pSrodek.z = 0;
                        //Znależć najbliższy punkt na tej curvie
                        eS = wCurva->getClosestPointTo( pSrodek, pClosest );
                        if( eS != eOk )
                        {
                           acdbFail( L"\nNie udało się pobrać punktu najbliższego!" );
                           acutPrintf( L" Kod błędu: %d", eS );
                           return;
                        }   //if( eS != eOk )
                        ads_real odl;
                        eS = wCurva->getDistAtPoint( pClosest, odl );
                        if( eS != eOk )
                        {
                           acdbFail( L"\nNie udało się pobrać odległości na curvie!" );
                           acutPrintf( L" Kod błędu: %d", eS );
                           return;
                        }   //if( eS != eOk )
                        //Zapamiętać odległość, oId i indeks;
                        vOdleglosciNaCurvie.push_back( odl );
                        vObjIdBlokow.push_back( wBlokRef->objectId() );                        
                        indeksy.push_back( i );
                        i++;
                     }   //if( !pPrzec.isEmpty() )
                  }   //if( wEnt->isA() == AcDbBlockReference::desc() )
                  wEnt->close();
               }   //if( eS == eOk )
               else
               {
                  acdbFail( L"\nNie można otworzyć obiektu!" );
                  acutPrintf( L" Kod błędu: %d", eS );
               }   //else if( eS == eOk )
            }   //if( wCurSpcIt->getEntity( wEnt, kForRead ) == eOk )
            else
            {
               acdbFail( L"\nNie można otworzyć obiektu!" );
               acutPrintf( L" Kod błędu: %d", eS );
            }   //else if( wCurSpcIt->getEntity( wEnt, kForRead ) == eOk )
         }   //for( ; !wCurSpcIt->done(); wCurSpcIt->step() )
         delete wCurSpcIt;
         
         wCurva->close();
         //Posortować wg odległości
         if( indeksy.empty() )
         {
            curSpc->close();
            return;
         }   //if( indeksy.empty() )
         sortowanie::sortWektor( vOdleglosciNaCurvie, indeksy );
         curSpc->upgradeOpen();
         
         //Posortowane wg odległości. Otwierać każdy blok i nadpisywać atrybut.
         for( int i = 0; i < indeksy.size(); i++ )
         {
            AcDbEntity* wEnt = NULL;
            ErrorStatus eS = acdbOpenAcDbEntity( wEnt, vObjIdBlokow.at( indeksy.at( i ) ), kForWrite );
            if( eS != eOk )
            {
               acdbFail( L"\nNie można otworzyć obiektu!" );
               acutPrintf( L" Kod błędu: %d", eS );
               continue;
            }   //if( eS != eOk )
            //Sprawdzić czy posiada żądany atrybut
            AcDbBlockReference* wBlokRef = AcDbBlockReference::cast( wEnt );
            AcDbObjectIterator* wAtrIter = wBlokRef->attributeIterator();
            if( wAtrIter != NULL )
            {
               for( wAtrIter->start(); !wAtrIter->done(); wAtrIter->step() )
               {
                  AcDbAttribute* wAtrRef = NULL;
                  if( wBlokRef->openAttribute( wAtrRef, wAtrIter->objectId(), kForRead ) != eOk )
                     continue;
                  //Atrybut otwarty do odczytu. Sprawdzić nazwę.
                  if( nazwaAtr.compareNoCase( wAtrRef->tagConst() ) == 0 )
                  {
                     //Nazwa się zgadza - nadpisać.
                     wAtrRef->upgradeOpen();
                     wss.clear();
                     wss.width( iloscZnakow );
                     wss.fill( '0' );
                     wss << nr;
                     wss >> str;
                     AcString txtWy( prefix );
                     txtWy += str.c_str();
                     wAtrRef->setTextString( txtWy.kACharPtr() );
                     nr++;
                     wAtrRef->close();
                     break;
                  }   //if( nazwaAtr.compareNoCase( wAtrRef->tagConst() )
                  wAtrRef->close();
               }   //for( wAtrIter->start(); !wAtrIter->done(); wAtrIter->step() )
               delete wAtrIter;
            }   //if( wAtrIter != NULL )
            wBlokRef->close();
         }   //for( int i = 0; i < indeksy.size(); i++ )
         curSpc->close();
      }
      catch( ... )
      {
         acedPrompt( _T( "\nMakro się rozkraczyło!" ) );
      }
   }
Załączniki
RKUCInumeratorCurva.arx
AC2k7+
(110.5 KiB) Pobrane 26 razy
badziewiak

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

Re: zbiór wskazań zaznaczony polilinią

Postprzez kruuger » maja 16, 2011 22:14

cos to badziewiaku naprzestawiales u siebie.
caly czas ten AcRxDynamicLinker. z poprzednim bylo podobnie.
moze cos na kompie cza miec ?
k.
Avatar użytkownika
kruuger
 
Posty: 4831
Dołączył(a): paź 27, 2005 20:14
Lokalizacja: Kraków

Re: zbiór wskazań zaznaczony polilinią

Postprzez badziewiak » maja 16, 2011 23:21

kruuger napisał(a):cos to badziewiaku naprzestawiales u siebie.
caly czas ten AcRxDynamicLinker. z poprzednim bylo podobnie.
moze cos na kompie cza miec ?
k.

Niemozliwe. Wiem jaka byla wczesniej przyczyna. Nie powinno sie to zdarzyc. W zalaczniku poprawiona merytorycznie wersja, ale bez uwzglednienia AcRxDynamicLinker...
EDIT:
Wklej ten komunikat, ale najpierw sciagnij nowsza wersje.
Załączniki
RKUCInumeratorCurva.arx
(115.5 KiB) Pobrane 21 razy
badziewiak

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

Re: zbiór wskazań zaznaczony polilinią

Postprzez z » maja 18, 2011 13:15

badziewiak napisał(a):Wklej ten komunikat, ale najpierw sciagnij nowsza wersje.

Niby działa, ale pomija niektóre bloki
1.jpg
1.jpg (5.4 KiB) Przeglądane 265 razy

Przydało by się jakieś okienko do wprowadzania danych (albo przynajmniej lista tagów wskazanych bloków w linii poleceń)
z
z
 
Posty: 1950
Dołączył(a): cze 16, 2009 22:49

Re: zbiór wskazań zaznaczony polilinią

Postprzez badziewiak » maja 18, 2011 13:32

z napisał(a):
badziewiak napisał(a):Wklej ten komunikat, ale najpierw sciagnij nowsza wersje.

Niby działa, ale pomija niektóre bloki
1.jpg

Przydało by się jakieś okienko do wprowadzania danych (albo przynajmniej lista tagów wskazanych bloków w linii poleceń)

Jesli mozesz, to wrzuc tu rys. dwg.
badziewiak

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

Re: zbiór wskazań zaznaczony polilinią

Postprzez kojacek » maja 18, 2011 13:41

nieco obok...
@badziewiak: popraw mnie jeśli się mylę ( :?: ) ale czy ty sprawdzasz, czy curva przecina się z blokiem roz***jąc blok :shock: :?:

kojacek
Avatar użytkownika
kojacek
 
Posty: 5432
Dołączył(a): paź 03, 2005 20:17

Re: zbiór wskazań zaznaczony polilinią

Postprzez badziewiak » maja 18, 2011 14:11

kojacek napisał(a):nieco obok...
@badziewiak: popraw mnie jeśli się mylę ( :?: ) ale czy ty sprawdzasz, czy curva przecina się z blokiem roz***jąc blok :shock: :?:

kojacek

Tak, bo chcialem zrobic to dla splajnow, polilinii lukowych itp. Widze jednak, ze srednio to dziala (u niektorych), wiec zrobie to w oparciu o zbior wskazan.
EDIT:
Jak sie upre, to podziele curve na punkty, zeby chociaz z grubsza polapac luki.
badziewiak

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

Re: zbiór wskazań zaznaczony polilinią

Postprzez kojacek » maja 18, 2011 14:23

badziewiak napisał(a):Tak, bo chcialem zrobic to dla splajnow, polilinii lukowych itp. Widze jednak, ze srednio to dziala (u niektorych), wiec zrobie to w oparciu o zbior wskazan.
EDIT:
Jak sie upre, to podziele curve na punkty, zeby chociaz z grubsza polapac luki.


Jakieś szczególne uzasednienie potrzeby takiego wyboru? Nie wystarczy polilinia z (tylko) segmentami liniowymi?

kojacek
Avatar użytkownika
kojacek
 
Posty: 5432
Dołączył(a): paź 03, 2005 20:17

Poprzednia stronaNastępna strona

Powrót do AutoCAD

Kto przegląda forum

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