找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1105|回复: 0

[分享] Use KeyWords To Provide Choices For Users

[复制链接]

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-6-6 22:13:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
http://streamlined-design.blogsp ... rovide-choices.html

C#.Net: Use KeyWords To Provide Choices For Users



Let's add some keyword options to our circle MText program. The current version allows the user to enter a string to search for and then places a red circle around all matching MText entities in the drawing. To practice with the GetKeywords method we will let the user choose a different color for the circle from a list of choices.
Here is the C# code, note extended comments from previous versions have been removed.



using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;




using Autodesk.AutoCAD.Runtime;

using Autodesk.AutoCAD.ApplicationServices;

using Autodesk.AutoCAD.DatabaseServices;

using Autodesk.AutoCAD.EditorInput;

using Autodesk.AutoCAD.Geometry;




namespace SLD_Demo

{

    public class MTextTools

    {

        [CommandMethod("SLDcirText")]

        public void SLDcirText()

        {

            //get current document

            Document acDoc =

                Application.DocumentManager.MdiActiveDocument;




            //get AutoCAD database

            Database acCurDb = acDoc.Database;




            //get string to search for

            String sldStrToSrch = SLDgetStringFromUser(acDoc);




            //get color of circle

            int sldCirColor = SLDgetColorFromUser(acDoc);




            //start db transaction

            using (Transaction acTrans =

                acCurDb.TransactionManager.StartTransaction())

            {

                //open block table

                BlockTable bt = (BlockTable)acTrans.GetObject

                    (acCurDb.BlockTableId, OpenMode.ForRead);




                BlockTableRecord btr = (BlockTableRecord)

                    acTrans.GetObject(bt[BlockTableRecord.ModelSpace],

                    OpenMode.ForRead);




                //iterate through block table to locate mtext objects

                foreach (ObjectId id in btr)

                {

                    //open each object to read

                    DBObject obj = acTrans.GetObject

                        (id, OpenMode.ForRead);




                    //only deal with MText objects

                    MText dbMText = obj as MText;




                    //if current object is Mtext

                    if (dbMText != null)

                    {

                        String curTxtValue = dbMText.Contents;

                        //and if the contents include the string entered

                        //by user

                        if (string.Equals(sldStrToSrch, curTxtValue,

                            StringComparison.CurrentCultureIgnoreCase))

                        {



                            //draw a circle around the mtext entity

                            /*add an additional parameter from the last

                              version to pass the color index*/

                            SLDdrawCir(acCurDb, acTrans,

                                dbMText, sldCirColor);


                        }

                    }

                }

                //commit the transaction so we do not leave the db open

                acTrans.Commit();

            }

        }




        //function to get text string from user

        public String SLDgetStringFromUser(Document acDoc)

        {

            PromptStringOptions pStrOpts = new PromptStringOptions(

                "\nFind What: ");




            //control the prompt string options to behave like we want

            //such as allow spaces to be entered

            pStrOpts.AllowSpaces = true;




            //retrieve the string entered by user

            PromptResult pStrRes = acDoc.Editor.GetString(pStrOpts);




            //and assign to a new string variable

            String sldStr = pStrRes.StringResult;




            //return the string variable to calling function

            return sldStr;

        }




        /*function to get desired color from user. Gets preferred

          color entered as string, converts to int, and returns*/

        public int SLDgetColorFromUser(Document acDoc)

        {

            /*The GetKeywords method allows a selection to be presented

              to the user and requires a matching value to be entered.

              Error handling is already built in, if an invalid option

              is entered a message is displayed and the user is prompted

              again. Also, a matching value can be the first letter (not

              case sensitive) or some or all of a keyword. A default

              value can also be defined. The Message value is important

              too, this is the main message displayed along with the list

              of keywords.*/

            PromptKeywordOptions pKeyOpts = new PromptKeywordOptions("");

            pKeyOpts.Message = "\nSelect color of circle ";

            pKeyOpts.Keywords.Add("Red");

            pKeyOpts.Keywords.Add("Green");

            pKeyOpts.Keywords.Add("Yellow");

            pKeyOpts.Keywords.Add("Blue");

            pKeyOpts.Keywords.Default = "Red";




            //call GetKeywords and pass in our options

            PromptResult pKeyRes = acDoc.Editor.GetKeywords(pKeyOpts);




            //create int value to store color index (default to red)

            int sldCirColor = 1;




            /*switch statement to convert the color string

              to a color index value*/

            switch (pKeyRes.StringResult)

            {

                case "Green":

                    sldCirColor = 3;

                    break;

                case "Yellow":

                    sldCirColor = 2;

                    break;

                case "Blue":

                    sldCirColor = 5;

                    break;

            }




            return sldCirColor;

        }




        //function to draw circle around an MText object

        public void SLDdrawCir(Database acCurDb,

            Transaction acTrans, MText MtextObj,

            int cirColor)

        {

            //define a new point object for the center point of circle

            Point3d cenPoint = new Point3d();




            //use the location method of the Mtext object to define

            //the center point coordinates

            cenPoint = MtextObj.Location;




            //define a new Circle object

            Circle textCir = new Circle();

            textCir.Center = cenPoint;

            textCir.Diameter = 1.0;

            //assign color index the value entered by user

            textCir.ColorIndex = cirColor;




            //now add the circle to the drawing (model space)

            BlockTable acBlkTbl;

            acBlkTbl = acTrans.GetObject(

                acCurDb.BlockTableId, OpenMode.ForRead) as BlockTable;




            BlockTableRecord acBlkTblRec;

            acBlkTblRec = acTrans.GetObject(

                acBlkTbl[BlockTableRecord.ModelSpace],

                OpenMode.ForWrite)

                as BlockTableRecord;




            acBlkTblRec.AppendEntity(textCir);

            acTrans.AddNewlyCreatedDBObject(textCir, true);

        }

    }

}




To test, NETLOAD the .dll into AutoCAD and place some MText entities. Try entering an invalid keyword. Also, test out entering just the first letter of a keyword, the first few letters, or the entire string. It all works!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-18 23:58 , Processed in 0.381770 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表