Как создавать слои AutoCAD с помощью оконных форм?

Я работаю над созданием плагина формы Windows для создания слоев из выбранных пользователем элементов в моей форме Windows.

Я читаю список слоев в списке (lbGetLayers), список модификаторов в другом списке (lbModifyer) из двух разных файлов csv. Кроме того, я создал два класса для хранения объектов слоя и модификатора.

Цель: создать новый слой с правильным именем, цветом, стилем линии и весом линии на основе выбранных пользователем элементов.

Проблема: я пытаюсь написать функцию для построения логики перед созданием слоя, чтобы удовлетворить два следующих условия:

1) Слой — будет иметь цвет, стиль и толщину линии. Позвольте пользователю выбрать 1 или более. Если пользователь выбирает более 1, приложение создаст все выбранные слои.

2) Модификатор — переопределяет цвет, стиль и толщину линии. Пользователь может выбрать 0 или 1.

3) Статус (отредактировано) - снова переопределит цвет, стиль и вес линии. Пользователь может выбрать 0 или 1.

Я придумал функцию, которая не подходит для удовлетворения этих условий. Я был бы очень признателен, если бы кто-нибудь помог мне решить эту проблему.

Спасибо!!

BuildLayers:

  public Intellayer Buildlayer()
{
    //can select Layer - 1 or more 
    //Get Selected Layer Object - color, line style & line weight
       foreach(Intellayer SelectedLayer in lbGetLayers.Items)
       {
            foreach (Modifyer SelectedModifyer in lbModifyer.Items)
            { 
                if(lbGetLayers.SelectedItems.Count > 1 || lbModifyer.SelectedItems.Count <= 1)
                System.Diagnostics.Debug.WriteLine(SelectedLayer.layername + "-" + SelectedModifyer.name);
            }
        }

Класс:

public class layer
    {
       public string disciplane { get; set; }  
       public string layername { get; set; }
       public string Linetype { get; set; }
       public int? Layercolor { get; set; }
       public string Description { get; set; }
       public string Lineweight { get; set; }
       public override string ToString()
        {
            return layername;
        }
    }

 public class Modifyer
    {
        public string discipline { get; set; }
        public string name { get; set; }
        public int? color { get; set; }
        public string Linetype {get;set;}
        public string Lineweight { get; set; }
        public string Description { get; set; }
        public override string ToString()
        {
            return name;
        }
    }

Отредактировано:

BuildLayers:

 public List<layer> Buildlayers()
        {
            //Build selected layers

            List<layer> Getselectedlayers = null;//list of selected layers
            if (lbGetLayers.SelectedItems.Count >= 1) 
            {
                    Getselectedlayers = new List<layer>();
                    Getselectedlayers.AddRange(lbGetLayers.SelectedItems.Cast<layer>());
                    foreach (layer lname in Getselectedlayers)
                    {
                        lbGetLayers.SelectedItems.Cast<layer>();
                        System.Diagnostics.Debug.WriteLine(lname.Linetype + "," + lname.Lineweight + "," + lname.Layercolor);
                     }
                if (lbModifyer.SelectedItems.Count == 1)
                {
                    Modifyer modifyer = (Modifyer)lbModifyer.SelectedItem;
                    foreach (layer lname in Getselectedlayers)
                    {
                        lname.Override(modifyer);//Override with Modifyers
                    }
                }
                if(lbStatus.SelectedItems.Count == 1)
                {
                     Status status = (Status)lbStatus.SelectedItem;
                    foreach (layer lname in Getselectedlayers)
                    {
                        lname.Override(status);//Override with Status
                    }
                }
            }
            return Getselectedlayers;//return list of selected layers
        }       
        }
    }

Класс:

 public class layer
        {
           public string disciplane { get; set; }  
           public string layername { get; set; }
           public string Linetype { get; set; }
           public int? Layercolor { get; set; }
           public string Description { get; set; }
           public string Lineweight { get; set; }

            public layer Override(Modifyer modifyer)
            {
                layer newLayer = new layer();
                newLayer.layername = this.layername;
                newLayer.Layercolor = modifyer.color;
                newLayer.Linetype = modifyer.Linetype;
                newLayer.Lineweight = modifyer.Lineweight;
                return newLayer;
            }
           public layer Override(Status status)
            {
                layer newlayer = new layer();
                newlayer.layername = this.layername;
                newlayer.Layercolor = status.color;
                newlayer.Linetype = status.Linetype;
                newlayer.Lineweight = status.Lineweight;
                return newlayer;
            }
            public override string ToString()
            {
                return layername;
            }
        }

person Rck7    schedule 14.11.2017    source источник
comment
Пожалуйста, никогда не меняйте подобный вопрос. Это делает принятый ответ совершенно бессмысленным, и будущие читатели будут ломать голову над тем, почему это принятый ответ. По крайней мере, поместите его под исходным сообщением с заголовком EDIT, чтобы вопрос и ответ по-прежнему имели смысл. Но на самом деле это должен был быть новый вопрос. Я ясно вижу вашу проблему, но я не меняю свой ответ полностью, так как это огромная трата моего времени! Пожалуйста, исправьте свой вопрос, как я предложил, и я добавлю правку внизу своего ответа.   -  person Nik    schedule 23.11.2017
comment
Эта тема может стоит прочитать.   -  person Nik    schedule 23.11.2017
comment
@Nik, как и было предложено, я отредактировал код в исходном сообщении. Пожалуйста, извините меня за мою ошибку. Я сохраню ваши предложения для будущих сообщений. Спасибо.   -  person Rck7    schedule 26.11.2017
comment
После дальнейшего размышления ваш код имеет ряд проблем, и лучше задать новый вопрос, если вы действительно хотите получить хороший ответ. См. этот вопрос и ответ. Я полагаю, что вы получите решение от кого-то в течение нескольких минут. Если это не так, дайте мне знать, и я отвечу на него. Ответ на ваш дополнительный вопрос здесь действительно отвлекает от исходного вопроса и делает его не очень полезным для будущих читателей.   -  person Nik    schedule 26.11.2017
comment
@Nik, я понимаю твое мнение по этому вопросу. Кроме того, я застрял с этой проблемой в течение недели и не мог продолжить. Думал, что ваш предыдущий ответ сработает, и он сработал в некоторой степени, но я не могу переопределить значения в соответствии с вопросом. Решил вернуть вам этот вопрос, поскольку вы уже предлагали ответ ранее. Буду признателен, если вы поможете ответить на него. Спасибо.   -  person Rck7    schedule 27.11.2017


Ответы (1)


Кажется, у вас есть большая часть мяса, но в коде, который вы разместили, есть пара проблем, помимо логики внутри метода Buildlayer().

Начнем с конструктора. Задача конструктора — инициализировать форму. Это также хорошее место для назначения данных элементам управления. Здесь у пользователя не было возможности выбрать какие-либо элементы, так как формы еще не видны. Именно здесь вы должны анализировать файл CSV и назначать полученные объекты вашим соответствующим спискам.

public LayerCreationTool()
{
    InitializeComponent();
    fillListBoxes();
}

private void fillListBoxes()
{
    //get layers from CSV here and put them into ListBox
    lbGetLayers.Items.AddRange(getLayersFromCSV().ToArray());
    lbModifyer.Items.AddRange(getModifiersFromCSV().ToArray());
}

private List<layer> getLayersFromCSV()
{
    List<layer> layers = new List<layer>();
    //...Do your parsing here;
    return layers;
}

private List<Modifier> getModifiersFromCSV()
{
    List<Modifier> modifiers = new List<Modifier>();
    //...Do your parsing here;
    return modifiers;
}

Я также добавил метод Override() в ваш класс layer. Это позволит вам легко использовать ваш модификатор.

public class layer
{
    public string layername { get; set; }
    public string Linetype { get; set; }
    public int? Layercolor { get; set; }
    public string Lineweight { get; set; }

    public layer Override(Modifier modifier)
    {
        layer newLayer = new layer();
        newLayer.layername = this.layername;
        newLayer.Layercolor = modifier.color;
        newLayer.Linetype = modifier.Linetype;
        newLayer.Lineweight = modifier.Lineweight;
        return newLayer;
    }

    public override string ToString()
    {
        return layername;
    }
}

Теперь, когда у вас есть функциональная форма, вам нужен способ, чтобы пользователь сказал «Вперед». Я взял на себя смелость добавить кнопку в форму, и в событии нажатия кнопки вы должны создавать свои слои в соответствии с вашей логикой. Кроме того, поскольку вы хотите вернуть более одного слоя, Buildlayers() должно возвращать List<layer>, а не layer.

Идея логики проста: если модификатор НЕ выбран, то добавить все выбранные слои для добавления в AutoCad. Если выбран модификатор, используйте метод Override() для захвата и изменения всех выбранных элементов по одному.

private void btnImport_Click(object sender, EventArgs e)
{
    List<layer> layersToAddToAutoCad = Buildlayers();
    //now use your these layers to add to AutoCad...
}

//You need to return a List of layers that you then use
//to add layers to AutoCad
public List<layer> Buildlayers()
{
    List<layer> ret = null;

    if(lbGetLayers.SelectedItems.Count > 0)
    {
        ret  = new List<layer>();
        //if no modifier selected, great, just grab all the selected layers
        if (lbModifyer.SelectedItems.Count == 0)
        {
            ret.AddRange(lbGetLayers.SelectedItems.Cast<layer>());
        }
        else
        {
            Modifier modifier = (Modifier)lbModifyer.SelectedItem;
            foreach (layer layerToAdd in lbGetLayers.SelectedItems)
            {
                ret.Add(layerToAdd.Override(modifier));
            }
        }
    }
    return ret;//method must return something.
}
person Nik    schedule 15.11.2017
comment
Оно работает!! Большое спасибо. Кроме того, я добавил новое условие, т. е. состояние, которое снова переопределит цвет, стиль и вес линии. Пользователь может выбрать 0 или 1. Нужно ли обновлять класс Layer методом переопределения (состояние состояния)? и обновить функцию Build Layer ()? Пожалуйста, дайте мне знать о ваших мыслях по этому поводу. Спасибо - person Rck7; 15.11.2017
comment
Пожалуйста. Вы можете перегрузить метод Override, чтобы получить State ИЛИ Modifier. Измените свой BuildLayers() соответственно, логика должна быть такой же, как у меня в ответе. - person Nik; 16.11.2017
comment
Спасибо!! Кроме того, есть ли способ получить выбранные элементы из двух списков, разделенных -, и отобразить полную строку в форме? Например: если я выбираю элемент XXX из списка 1 и элемент YYY из списка 2, я хочу отображать имя моего проекта как XXX-YYY? Пожалуйста, дайте мне знать ваши мысли по этому поводу. - person Rck7; 16.11.2017
comment
Как вы и предложили, я обновил свою функцию и класс для переопределения объектов слоя. Но по какой-то причине не удается переопределить значения? Не уверен, чего не хватает. Не могли бы вы помочь мне с этим? Спасибо. Пожалуйста, смотрите обновленный код в вопросе. - person Rck7; 22.11.2017