Форум сайта python.su
Уважаемые коллеги! Есть такой нехитрый код:
def createMenu(self, master = None): self.mb = Menubutton(master, indicatoron = 1) self.mb.pack(padx = 2, pady = 1) self.menu = Menu(self.mb, tearoff = 0, bg = 'white') self.mb.configure(menu = self.menu) return self.mb def ConnectACAD(self): self.acad = GetActiveObject("AutoCAD.Application") self.dwg = self.acad.ActiveDocument self.mspace = self.dwg.ModelSpace self.master.title(self.title+' - '+self.dwg.Name.encode('utf-8')) for layer in self.dwg.Layers: self.menu.add_command(label = layer.Name, command = self.SetActiveLayer) self.mb.configure(text = self.menu.entrycget(0, 'label')) def SetActiveLayer(self): self.RefreshDisplay(self.menu.entrycget(ACTIVE, 'label')) def RefreshDisplay(self, layerString): self.mb.configure(text = layerString)
Офлайн
Очень просто. Использовать анонимную функцию lambda. Только не забудьте, что в цикле нужно объект слоя передавать явно.
Офлайн
Уважаемый друг! Огромное спасибо! Благодаря Вам изучил применение lambda в Tkinter. Вот так все работает:
def ConnectACAD(self): self.acad = GetActiveObject("AutoCAD.Application") self.dwg = self.acad.ActiveDocument self.mspace = self.dwg.ModelSpace self.master.title(self.title+' - '+self.dwg.Name.encode('utf-8')) for x in xrange(0,self.dwg.Layers.Count) : self.menu.add_command(label = self.dwg.Layers[x].Name, command = lambda z = x: self.SetActiveLayer(z)) self.MenuVar.set(self.menu.entrycget(0, 'label')) def SetActiveLayer(self, idx): self.MenuVar.set(self.menu.entrycget(idx, 'label'))
Отредактировано SirJorah (Июнь 2, 2015 15:09:34)
Офлайн
Да пожалуйста.
Теперь минусы кода:
1. Не надо делать from tkinter import *
2. В свободное время почитайте про PEP8.
3. Почему:
command = lambda z = x: self.SetActiveLayer(z)
command=lambda x=x: self.SetActiveLayer(x)
Отредактировано 4kpt_III (Июнь 2, 2015 15:36:44)
Офлайн
Согласен. x=x тоже работает. И что не следует делать from tkinter import * - тоже поддерживаю. В действующем проекте (http://sourceforge.net/projects/xml2mif/) у меня так и написано:
from Tkinter import Tk, Button, Frame, Label, LabelFrame, Radiobutton, Entry, Text, Scrollbar, IntVar from Tkinter import DISABLED, NORMAL, END from tkFileDialog import Open, Directory
Офлайн
Да. Так действительно лучше, но…
from Tkinter import DISABLED, NORMAL, END
Офлайн
Хо-хо, глянуть еще не успел, но подозреваю, что как и в случае с упомянутой уважаемым Микки Нардо переменной (или скорее предполагается что константой) ACTIVE:
DISABLED = ‘disabled’
NORMAL = ‘normal’
END = ‘end’
))))
Кстати, если Вы долго работали с автокадом, может подкинете идейку, как обратиться к внутренней базе данных чертежа? db = dwg.Database срабатывает, а вот дальше - никакие StartTransaction не прокатывают. А лопатить чертеж с over 56K графических объектов, чтобы выбрать например все полилинии, принадлежащие определенному слою, по времени долго, тем более что ясно - можно быстрее, ведь команда QuickSelect конечно тоже немного думает, но в сравнении с полным перебором отвечает практически мгновенно.
Офлайн
Работал как пользователь. Не в разрезе программирования
Офлайн
Ясно. Как пользователь я уж тоже давно тружусь. Программировать было пытался на Delphi, но из-за недостатка внятной документации бросил. Перешел на ГИС ObjectLand - там объектная модель в хелпе детально описана, поэтому не составляет труда внедрить окно карты в свою форму и тащить оттуда координаты полигонов (земельных участков), чтобы потом сформировать межевой план. Но сейчас работаю в конторе, где используют только автокад, поскольку съемку первоначально формируют топографы, потом с ней работают геологи, геофизики, гидрологи - и только в самом конце все это поступает в наш отдел, где мы должны разработать проект межевания земельных участков. Объекты тянутся на сотни километров, участков получаются тоже сотни, если не тысячи - и для каждого надо сформировать ведомость координат. Так что даже полным перебором объектов лучше, чем вручную. Выкину перебор объектов чертежа в отдельный поток, чтобы форма не “замерзала”, а тем временем продолжу искать подступы к database. Вот так как-то )))
Офлайн
ИМХО, в Акаде, для выбора геометрических примитивов из какого либо пространства по определенным критериям лучше сформировать SelectionSet, а потом уже его проитерировать чтоли.
Офлайн