Muitos comandos do AutoCAD que o trabalham em conjuntos de entidades ou seja, você pode selecionar um conjunto de objetos e aplicar um comando. Isso basicamente significa que se o usuário tem pré-selecionado um conjunto de entidades e, em seguida, lança comando e será necessário solicitar que o usuário selecioná-los novamente, isso é pratico é útil.
Isto é possível usando algo chamado PICKFIRST que está definido dentro de AutoCAD. Para aproveitar esse recurso dentro de seus comandos, a primeira coisa a fazer é usar uma CommandFlag especial chamada "UsePickSet": isto diz o editor do AutoCAD não para limpar o conjunto PICKFIRST quando o comando é invocado. Em seguida, a implementação do comando usará o método SelectImplied () no objeto editor para recuperar o conjunto PICKFIRST, deve estar disponível. Nesta fase também é boa prática para limpar o PICKFIRST definido com SetImpliedSelection ().
O problema é que ele pode não ter selecionado nada e ai como se faz?
O exemplo mostra como usar o PICKFIRST permitindo que mesmo que o usuário não selecione nada ele volte a pedir uma seleção,ou seja, se não houver um conjunto PICKFIRST. Quanto ao que fazemos com as entidades selecionadas é a aplicação.
Este post eu fiz porque estava melhorando alguns dos meus comando e incluindo essa funcionalidade, tanto o exemplo como a fonte para esse post estão no Blog do Kean Walmsey
Isto é possível usando algo chamado PICKFIRST que está definido dentro de AutoCAD. Para aproveitar esse recurso dentro de seus comandos, a primeira coisa a fazer é usar uma CommandFlag especial chamada "UsePickSet": isto diz o editor do AutoCAD não para limpar o conjunto PICKFIRST quando o comando é invocado. Em seguida, a implementação do comando usará o método SelectImplied () no objeto editor para recuperar o conjunto PICKFIRST, deve estar disponível. Nesta fase também é boa prática para limpar o PICKFIRST definido com SetImpliedSelection ().
O problema é que ele pode não ter selecionado nada e ai como se faz?
O exemplo mostra como usar o PICKFIRST permitindo que mesmo que o usuário não selecione nada ele volte a pedir uma seleção,ou seja, se não houver um conjunto PICKFIRST. Quanto ao que fazemos com as entidades selecionadas é a aplicação.
using Autodesk.AutoCAD;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
namespace SelectionTest
{
public class PickfirstTestCmds
{
// Must have UsePickSet specified
[CommandMethod("PFT", CommandFlags.UsePickSet |
CommandFlags.Redraw |
CommandFlags.Modal)
]
static public void PickFirstTest()
{
Document doc =
Application.DocumentManager.MdiActiveDocument;
Editor ed = doc.Editor;
try
{
PromptSelectionResult selectionRes =
ed.SelectImplied();
// If there's no pickfirst set available...
if (selectionRes.Status == PromptStatus.Error)
{
// ... ask the user to select entities
PromptSelectionOptions selectionOpts =
new PromptSelectionOptions();
selectionOpts.MessageForAdding =
"\nSelect objects to list: ";
selectionRes =
ed.GetSelection(selectionOpts);
}
else
{
// If there was a pickfirst set, clear it
ed.SetImpliedSelection(new ObjectId[0]);
}
// If the user has not cancelled...
if (selectionRes.Status == PromptStatus.OK)
{
// ... take the selected objects one by one
Transaction tr =
doc.TransactionManager.StartTransaction();
try
{
ObjectId[] objIds = selectionRes.Value.GetObjectIds();
foreach (ObjectId objId in objIds)
{
Entity ent =
(Entity)tr.GetObject(objId, OpenMode.ForRead);
// In this simple case, just dump their properties
// to the command-line using list
ent.List();
ent.Dispose();
}
// Although no changes were made, use Commit()
// as this is much quicker than rolling back
tr.Commit();
}
catch (Autodesk.AutoCAD.Runtime.Exception ex)
{
ed.WriteMessage(ex.Message);
tr.Abort();
}
}
}
catch(Autodesk.AutoCAD.Runtime.Exception ex)
{
ed.WriteMessage(ex.Message);
}
}
}
}
Este post eu fiz porque estava melhorando alguns dos meus comando e incluindo essa funcionalidade, tanto o exemplo como a fonte para esse post estão no Blog do Kean Walmsey
Comentários
Postar um comentário