各位高手大家好,
小弟最近在畫一條線,
繪圖的概念是另用多點座標,串聯起來,現在碰到的問題是,這一條線是由很多線段所組成,
請問我要如何撰寫指令,可以讓眾多的線段,結合成一條聚合線呢?以下是我所撰寫的程式碼:
            List<double> repeat = new List<double>();
            List<string> mmXX = new List<string>();
            List<string> mmZZ = new List<string>();
            double x = 1505.4617;
            double y = 3200 + hh;            for (int i = 0; i < tList.Count; i += 2)
            {
                mmXX = tList[i].Tendon_X;
                mmZZ = tList[i].Tendon_Z;                for (int j = 2; j < tList[i].Tendon_NO.Count; j++)
                {
                    if (!repeat.Contains(Convert.ToDouble(mmXX[j])))
                    {
                        repeat.Add(Convert.ToDouble(mmXX[j]));
                    }
                    else
                    {
                        break;
                    }                    if (Convert.ToDouble(mmXX[j]) != 0 && Convert.ToDouble(mmXX[j]) <= ll * lu * 100)
                    {                        AcadLine linePT1;
                        double[] startpointPT1 = new double[] { x + Convert.ToDouble(mmXX[j - 1]), 
                                                                y + Convert.ToDouble(mmZZ[j - 1]), 
                                                                0 };
                        double[] endpointPT1 = new double[] { x + Convert.ToDouble(mmXX[j]), 
                                                              y + Convert.ToDouble(mmZZ[j]), 
                                                              0 };
                        linePT1 = gbl_doc.ModelSpace.AddLine(startpointPT1, endpointPT1);
                        linePT1.Layer = "L3";                        //AcadPolyline plinePT;
                        //double[] plpointsPT = new double[] { x + Convert.ToDouble(mmXX[j-1]), 
                        //                                     y + Convert.ToDouble(mmZZ[j-1]), 
                        //                                     0,
                        //                                     x + Convert.ToDouble(mmXX[j]), 
                        //                                     y + Convert.ToDouble(mmZZ[j]),
                        //                                     0};
                        //plinePT = gbl_doc.ModelSpace.AddPolyline(plpointsPT);
                        //plinePT.Update();
                        //plinePT.Layer = "L3";

                    }
                }
            }綠色的指令是我試著用聚合線的方式撰寫,
但因為寫的方法不對,所以最後呈現的圖跟用線段撰寫所產生的結果一模一樣......
想了很久實在想不到解決辦法,希望有高手可以點破盲點~在CAD程式中,工作欄裡面有項:  修改-物件-聚合線 可以達到我想要的效果(線段轉換成聚合線),
不知...要如何在C# 中完成這項指令呢?怕各位看得有點亂,整理一下重點:
1.使用聚合線方式撰寫,直接畫出一條線。
2.或者,增加指令,將線段轉換成聚合線。懇請各位高手指教,感謝各位!

解决方案 »

  1.   

     List<double> repeat = new List<double>();
      List<string> mmXX = new List<string>();
      List<string> mmZZ = new List<string>();
      double x = 1505.4617;
      double y = 3200 + hh;  for (int i = 0; i < tList.Count; i += 2)
      {
      mmXX = tList[i].Tendon_X;
      mmZZ = tList[i].Tendon_Z;  for (int j = 2; j < tList[i].Tendon_NO.Count; j++)
      {
      if (!repeat.Contains(Convert.ToDouble(mmXX[j])))
      {
      repeat.Add(Convert.ToDouble(mmXX[j]));
      }
      else
      {
      break;
      }  if (Convert.ToDouble(mmXX[j]) != 0 && Convert.ToDouble(mmXX[j]) <= ll * lu * 100)
      {  AcadLine linePT1;
      double[] startpointPT1 = new double[] { x + Convert.ToDouble(mmXX[j - 1]),  
      y + Convert.ToDouble(mmZZ[j - 1]),  
      0 };
      double[] endpointPT1 = new double[] { x + Convert.ToDouble(mmXX[j]),  
      y + Convert.ToDouble(mmZZ[j]),  
      0 };
      linePT1 = gbl_doc.ModelSpace.AddLine(startpointPT1, endpointPT1);
      linePT1.Layer = "L3";  //AcadPolyline plinePT;
    //double[] plpointsPT = new double[] { x + Convert.ToDouble(mmXX[j-1]), y + Convert.ToDouble(mmZZ[j-1]), 0,
    // x + Convert.ToDouble(mmXX[j]), y + Convert.ToDouble(mmZZ[j]), 0};
    //plinePT = gbl_doc.ModelSpace.AddPolyline(plpointsPT);
    //plinePT.Update();
    //plinePT.Layer = "L3";
      }
      }
      }
      

  2.   


    感謝foreverwoyou大的建議~
    之前都沒注意到還可以使用模板,非常感謝!!
      

  3.   

    各位高手們好,
    經過一天後,我想出了解決方法,不過在最後碰到了一個問題,
    有請各位高手幫忙解惑,以下是我的程式碼:
     List<double> repeat = new List<double>();
                List<string> mmXX = new List<string>();
                List<string> mmZZ = new List<string>();
                List<double> plpointsPTX = new List<double>();
                List<double> plpointsPTY = new List<double>();
                AcadPolyline plinePT;
                double[] plpointsPT = new double[] { };
                double x = 1505.4617;
                double y = 3200 + hh;
                int ppt = 0;            for (int i = 0; i < tList.Count; i += 2)
                {
                    mmXX = tList[i].Tendon_X;
                    mmZZ = tList[i].Tendon_Z;                for (int j = 2; j < tList[i].Tendon_NO.Count; j++)
                    {
                        if (!repeat.Contains(Convert.ToDouble(mmXX[j])))
                        {
                            repeat.Add(Convert.ToDouble(mmXX[j]));
                        }
                        else
                        {
                            break;
                        }                    if (Convert.ToDouble(mmXX[j]) != 0 && Convert.ToDouble(mmXX[j]) <= ll * lu * 100)
                        {
                            plpointsPTX.Add(x + Convert.ToDouble(mmXX[j - 1]));
                            plpointsPTY.Add(y + Convert.ToDouble(mmZZ[j - 1]));
                        }
                    }
                }
                plpointsPT = new double[plpointsPTX.Count * 3];
                for (int cpt = 0; cpt < plpointsPTX.Count * 3; cpt += 3)
                {
                    plpointsPT[cpt] = plpointsPTX[ppt];
                    plpointsPT[cpt + 1] = plpointsPTY[ppt];
                    plpointsPT[cpt + 2] = 0;
                    ppt++;
                }
                plinePT = gbl_doc.ModelSpace.AddPolyline(plpointsPT);
                plinePT.Layer = "L3";開此版的問題已在上述的程式碼中解決,
    現在碰到的最後一個問題是:
    最後一個座標點無法讀程式裡,譬如說我總共要121個點,可是只有讀進120個點。
    我覺得是因為在最後的這段↓
    for (int cpt = 0; cpt < plpointsPTX.Count * 3; cpt += 3)
                {
                    plpointsPT[cpt] = plpointsPTX[ppt];
                    plpointsPT[cpt + 1] = plpointsPTY[ppt];
                    plpointsPT[cpt + 2] = 0;
                    ppt++;
                }
    跑三的倍數的關係,所以無法讀到多出來的那個點。
    不知道有沒有高手可以有方法解決呢??
    感謝各位~~
      

  4.   

    因為同個人不能連續回復三次,只好再申請一個帳號來解答......
    經過無數次debug後....
                #region//------預力鋼腱
                List<double> repeat = new List<double>();
                List<string> mmXX = new List<string>();
                List<string> mmZZ = new List<string>();
                List<double> plpointsPTX = new List<double>();
                List<double> plpointsPTY = new List<double>();
                AcadPolyline plinePT;
                double[] plpointsPT = new double[] { };
                double x = 1505.4617;
                double y = 3200 + hh;
                int ppt = 0;            for (int i = 0; i < tList.Count; i += 2)
                {
                    mmXX = tList[i].Tendon_X;
                    mmZZ = tList[i].Tendon_Z;                for (int j = 1; j < tList[i].Tendon_NO.Count; j++)
                    {
                        if (!repeat.Contains(Convert.ToDouble(mmXX[j])))
                        {
                            repeat.Add(Convert.ToDouble(mmXX[j]));
                        }
                        else
                        {
                            continue;
                        }
                        if (Convert.ToDouble(mmXX[j]) <= ll * lu * 100)
                        {
                            plpointsPTX.Add(x + Convert.ToDouble(mmXX[j]));
                            plpointsPTY.Add(y + Convert.ToDouble(mmZZ[j]));
                        }
                    }
                }
                plpointsPT = new double[plpointsPTX.Count * 3];
                for (int cpt = 0; cpt < plpointsPTX.Count * 3; cpt += 3)
                {
                    plpointsPT[cpt] = plpointsPTX[ppt];
                    plpointsPT[cpt + 1] = plpointsPTY[ppt];
                    plpointsPT[cpt + 2] = 0;
                    ppt++;
                }
                plinePT = gbl_doc.ModelSpace.AddPolyline(plpointsPT);
                plinePT.Layer = "L3";
                #endregion
    這帖終於可以結帖了!!!!問題其實不是在4樓所講的位置,其實是在中間這段↓
                    for (int j = 1; j < tList[i].Tendon_NO.Count; j++)
                    {
                        if (!repeat.Contains(Convert.ToDouble(mmXX[j])))
                        {
                            repeat.Add(Convert.ToDouble(mmXX[j]));
                        }
                        else
                        {
                            continue;
                        }
                        if (Convert.ToDouble(mmXX[j]) <= ll * lu * 100)
                        {
                            plpointsPTX.Add(x + Convert.ToDouble(mmXX[j]));
                            plpointsPTY.Add(y + Convert.ToDouble(mmZZ[j]));
                        }
                    }
    因為j-1的關係,所以當然永遠讀不到最後一個點......最後,要是日後若有朋友剛好也有相同問題的話,
    整個架構上是沒有問題的,內容物就是看個人做修改囉。
    那...因為這是CAD的二次開發,使用的是ActiveX,
    所以也要記得要加入 參考 與 using,repeat那段是因為我的資料會有重複,所以才有使用此程式碼跳過重複的資料,
    希望對大家有幫助,感謝各位