_

Tabela podzielona

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".

Tabela podzielona

Postprzez badziewiak » lip 05, 2019 21:00

Hej
Mamy sobie zwykłą tabelkę autocadową. Jeśli jest za wysoka, możemy ją skrócić na wysokość, dzięki czemu zawinie się obok. To jest prosta sprawa. Podnosimy poprzeczkę: Chciałbym dla każdej części wyznaczyć bounding box, a dokładniej prawy i lewy dolny narożnik. Czy ktoś już kombinował takie rzeczy? Potrzebuję to do zautomatyzowania optymalnego ułożenia tabelek na arkuszu.
badziewiak

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

Re: Tabela podzielona

Postprzez asa » lip 06, 2019 08:40

badziewiak napisał(a):Hej
Mamy sobie zwykłą tabelkę autocadową. Jeśli jest za wysoka, możemy ją skrócić na wysokość, dzięki czemu zawinie się obok. To jest prosta sprawa. Podnosimy poprzeczkę: Chciałbym dla każdej części wyznaczyć bounding box, a dokładniej prawy i lewy dolny narożnik. Czy ktoś już kombinował takie rzeczy? Potrzebuję to do zautomatyzowania optymalnego ułożenia tabelek na arkuszu.

Ech te tabelki ;-) Coś tam się kiedyś nimi katowałem w sensie przystosowania do moich skromnych potrzeb. Mam jednak drobny problem ze zrozumieniem zamysłu Twojego. Wrzuć coś obrazkwego jak możesz.
Pozdrawiam ciepło
asa
P.S
W starym temacie stringów i ich list... Zrobiłem coś urzytkowego bo mnie było potrzebne trochę oparte na Twoich założeniach. Wrzucę jak troszkę powygladzam.
asa
 
Posty: 616
Dołączył(a): lut 18, 2007 20:01

Re: Tabela podzielona

Postprzez badziewiak » lip 06, 2019 20:55

Sorki że po angielsku, ale zapodałem ten problem na forum autodeskowym i tam też zamieściłem odpowiedź. Jakby co to pytać.
Kod: Zaznacz cały
   public static List<KeyValuePair<Point3d /*pMin*/, Point3d /*pMax*/>> getBoundingBoxesOfTable( Table tab, Matrix3d ucs, Matrix3d ucsInv )
   {
      //(C)badziewiak
      //Rotation of the table will be ignored and causes incorrect work. Before using this function make sure if the table is NOT rotated!
      //All points will be transformed to UCS for calculations and finally transformed for WCS
      List<KeyValuePair<Point3d /*pMin*/, Point3d /*pMax*/>> extents = new List<KeyValuePair<Point3d, Point3d>>();
      //Walk through the rows and check if boundig box of cells is arranged upside-down. If not, the table at this moment is in new part.
      //Calculate what is possible from first row
      int numOfFirstRow = 0;
      bool endOfTable = false;
      do
      {
         Cell cellFirstFirst = tab.Cells[numOfFirstRow, 0];
         Point3dCollection cellFirstFirstExtents = cellFirstFirst.GetExtents(); //Left-top, right-top, left-bottom, right-bottom
         Point3d pLeftTopUCSfirstFirst = cellFirstFirstExtents[0].TransformBy( ucsInv );
         double xMin = pLeftTopUCSfirstFirst.X - ( double )cellFirstFirst.Borders.Left.Margin;
         Point3d pRightTopUCSfirstFirst = cellFirstFirstExtents[1].TransformBy( ucsInv );
         double yMax = pRightTopUCSfirstFirst.Y + ( double )cellFirstFirst.Borders.Top.Margin;
         Cell cellFirstLast = tab.Cells[numOfFirstRow, tab.Rows[numOfFirstRow].Count() - 1];
         Point3dCollection cellFirstLastExtents = cellFirstLast.GetExtents();  //Left-top, right-top, left-bottom, right-bottom
         Point3d pRightTopUCSFirstLast = cellFirstLastExtents[1].TransformBy( ucsInv );
         double xMax = pRightTopUCSFirstLast.X + (double)cellFirstLast.Borders.Left.Margin;   //For unknow for me reasons, the right cell margin is different than measured in the drawing but the same as left margin
         //Now walk through the rows and check negative bounds increment of the row
         double yMin = yMax;
         bool loopBreak = false;
         double currentYmin = yMin;
         for( int r = numOfFirstRow; r < tab.Columns[0].Count(); r++ )
         {
            endOfTable = r == tab.Columns[0].Count() - 1;
            Cell currentCell = tab.Cells[r, 0];
            Point3dCollection currentBounds = currentCell.GetExtents(); //Left-top, right-top, left-bottom, right-bottom
            Point3d pLeftBottomUCScurrent = currentBounds[2].TransformBy( ucsInv );
            currentYmin = pLeftBottomUCScurrent.Y - ( double )currentCell.Borders.Bottom.Margin;
            if( currentYmin < yMin )
            {
               yMin = currentYmin;
            }
            else
            {
               //Bounds increment is negative - add last calculated bounds to the finall collection
               extents.Add( new KeyValuePair<Point3d, Point3d>( new Point3d( xMin, yMin, 0 ).TransformBy( ucs ), new Point3d( xMax, yMax, 0 ).TransformBy( ucs ) ) );
               numOfFirstRow = r;
               loopBreak = true;
               break;
            }
         }
         if( !endOfTable )
         {
            endOfTable = !loopBreak;
         }
         if( endOfTable )
         {
            extents.Add( new KeyValuePair<Point3d, Point3d>( new Point3d( xMin, currentYmin, 0 ).TransformBy( ucs ), new Point3d( xMax, yMax, 0 ).TransformBy( ucs ) ) );
         }
      }
      while( !endOfTable );
      return extents;
   }
badziewiak

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


Powrót do AutoCAD

Kto przegląda forum

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