def job3():
    '''以该多边形的外包矩形的左下角为原点,实现沿着x方向的错切变换
    '''
    try:
        acad.doc.SelectionSets.Item('SS1').Delete()
    except Exception:
        print('Delete selection failed')

    selection = acad.doc.SelectionSets.Add('SS1')
    acad.prompt('选择一条多义线')
    selection.SelectOnScreen(aShort([0]), ['lwpolyline'])
    if selection.Count == 1:
        entity = selection.Item(0)
    else:
        print("选择的多义线多于一条")
        return
    coor = entity.Coordinates
    # minPnt=np.float_([0,0,0])
    # maxPnt=np.float_([0,0])
    # pBox=entity.GetBoundingBox
    # minx=pBox()[0][0]
    # miny=pBox()[0][1]
    # maxx=pBox()[1][0]
    # maxy=pBox()[1][1]
    retval = GetBoundingBox(entity)
    mat = multi(move(-retval[0], -retval[1]), shear(1),
                move(retval[0], retval[1]))
    newcoor = transform(mat, coor)
    entity.Coordinates = aDouble(newcoor)
    entity.Color = ACAD.acYellow
    acad.doc.Regen(1)
def job2():
    '''选取最长的对角线,以对角线的某一点为原点,沿该对角线伸长1.5倍
    绘制的线用蓝色表示
    '''
    try:
        acad.doc.SelectionSets.Item('SS1').Delete()
    except Exception:
        print('Delete selection failed')

    selection = acad.doc.SelectionSets.Add('SS1')
    acad.prompt('选择一条多义线')
    selection.SelectOnScreen(aShort([0]), ['lwpolyline'])
    if selection.Count == 1:
        entity = selection.Item(0)
    else:
        print("选择的多义线多于一条")
        return
    coor = entity.Coordinates  #tuple77
    vectorcoor = longestDiagonalLine(coor)
    basePnt = vectorcoor[0:2]
    endPnt = vectorcoor[2:4]
    angle = acad.doc.Utility.AngleFromXAxis(APoint(*basePnt), APoint(*endPnt))
    negbasePnt = [-x for x in basePnt]
    mat1 = multi(move(*negbasePnt), rotate(-angle))
    mat2 = scale(1.5)
    mat3 = multi(rotate(angle), move(*basePnt))
    mat = multi(mat1, mat2, mat3)
    newcoor = transform(mat, coor)
    entity.Coordinates = aDouble(newcoor)
    entity.Color = ACAD.acBlue
    acad.doc.Regen(1)
Beispiel #3
0
def demo5():  #选择集
    try:
        acad.doc.SelectionSets.Item('SS4').Delete()
    except Exception:
        print('未删除成功')
    sstext = acad.doc.SelectionSets.Add('SS4')
    filtertype = aShort([0])
    filterdata = ('circle', )
    sstext.SelectOnScreen(filtertype, filterdata)
Beispiel #4
0
def tin():
    """
    从文件中读取点,生成tin
    """
    acad = Autocad()
    ptlist = []
    num = acad.doc.Utility.GetInteger('请选择从:\n1.从文件中读取点 2.现有点(当前图层)生成三角网')
    if num == 1:
        fname = tkFileDialog.askopenfilename(title=u"选择文件",
                                             filetypes=[("text file", "*.txt"),
                                                        ("all", "*.*")],
                                             initialdir=r"D:\学习\计算机图形学")
        f = open(fname)
        lines = f.readlines()
        f.close()
        poLayer = acad.doc.Layers.Add('point')
        acad.doc.ActiveLayer = poLayer
        for i in range(1, len(lines), 2):
            t = lines[i].split(',')
            ap = APoint(float(t[1]), float(t[2]), float(t[3]))
            ptlist.append(ap)
            acad.model.AddPoint(ap)
    elif num == 2:
        try:
            acad.doc.SelectionSets.Item("SS1").Delete()
        except Exception:
            print('Delete selection failed')
        ss = acad.doc.SelectionSets.Add('SS1')
        ss.Select(ACAD.acSelectionSetAll, aShort([0, 8]), ['POINT', 'point'])
        for i in range(ss.Count):
            c = ss.Item(i).Coordinates
            ptlist.append(APoint(ss.Item(i).Coordinates))
    ptlist = PointSet(ptlist)
    minpo, maxpo = ptlist.GetBoundingBox()
    acad.app.ZoomWindow(minpo, maxpo)
    lineLayer = acad.doc.Layers.Add('line')
    lineLayer.Color = ACAD.acRed
    acad.doc.ActiveLayer = lineLayer
    points = np.array(ptlist)
    points = points[:, 0:2]
    tri = Delaunay(points)
    for simplex in tri.simplices:
        aplist = [
            APoint(ptlist[simplex[0]]),
            APoint(ptlist[simplex[1]]),
            APoint(ptlist[simplex[2]])
        ]
        lwp = acad.model.AddLightWeightPolyline(toLightWeightPolyline(aplist))
        lwp.Closed = True
Beispiel #5
0
def demo12():  #选择0层圆并将颜色改为红色
    try:
        acad.doc.SelectionSets.Item('SS5').Delete()
    except Exception:
        print('ss5不存在')
    ss = acad.doc.SelectionSets.Add('SS5')
    filtertype = aShort([0, 8])
    filterdata = ('Circle', '0')
    ss.SelectOnScreen(filtertype, filterdata)
    newcolor = acad.app.GetInterfaceObject('AutoCAD.AcCmColor.20')
    #.20 version independent
    newcolor.SetRGB(255, 0, 0)
    #Colors are identified by an AcCmColor object.
    # This object can hold an RGB value, an ACI number
    # (an integer from 1 to 255), or a named color.
    # Using an RGB value, you can choose from millions of colors.
    for entity in ss:
        entity.TrueColor = newcolor
    ss.Delete()
def job1():
    '''绕中心点逆时针旋转45度,绘制的线用红色表示
    '''
    try:
        acad.doc.SelectionSets.Item('SS1').Delete()
    except Exception:
        print('Delete selection failed')
    selection = acad.doc.SelectionSets.Add('SS1')
    acad.prompt('选择一条多义线')
    selection.SelectOnScreen(aShort([0]), ['lwpolyline'])
    if selection.Count == 1:
        entity = selection.Item(0)
    else:
        print("选择的多义线多于一条")
        return
    coor = entity.Coordinates  #tuple
    newcoor = transform(rotate(radians(45), *center(coor)), coor)
    entity.Coordinates = aDouble(newcoor)
    entity.Color = ACAD.acRed
    acad.doc.Regen(1)
Beispiel #7
0
def job5():
    try:
        acad.doc.SelectionSets.Item('SS1').Delete()
    except Exception:
        print('Delete selection failed')
    selection = acad.doc.SelectionSets.Add('SS1')
    acad.prompt('选择一条多义线')
    selection.SelectOnScreen(aShort([0]), ['lwpolyline'])
    if selection.Count == 1:
        entity = selection.Item(0)
    else:
        print('选择的多义线多于一条')
        return
    coor = entity.Coordinates
    ptlist = Polygon(coor)
    leftup = ptlist.Topleft
    index0 = ptlist.GetTopLeftIndex()
    retVal = ptlist.GetDirectionArea()
    oriention = retVal[0]
    area = abs(retVal[1])
    edge = ptlist.GetAverageEdgeLength()
    edgecenter = ptlist.GetEdgeCenter()
    height = edge / 20  #字高为平均边长的1/20
    num = 1
    if oriention:
        for i in range(index0, index0 - len(ptlist), -1):
            acad.model.AddText('J%d' % num, ptlist[i], height)
            acad.model.AddText('L%d' % num, edgecenter[i], height)
            num += 1
    else:
        for i in range(index0 - len(ptlist), index0, 1):
            acad.model.AddText('J%d' % num, ptlist[i], height)
            acad.model.AddText('L%d' % num, edgecenter[i], height)
            num += 1
    area = round(area, 2)
    #point=GetMiddle(ptlist)
    point = ptlist.Center
    acad.model.AddText('面积=%s' % area, point, height)