#!/usr/bin/env python

# -*- coding: cp936 -*-

'''

功能说明:

实现从supermap后台的mssql里点数据集到AutoCAD里文本型的转换。

要是改为多线程的效果可能会更好。但现在的处理量很小,用不着给自己找麻烦

2011-10-4~2011-10-5

TODO:程度里的try...except太多,有些可以改成with语句。

'''

__author__ = 'shifeng'

import pyodbc

import logging

import comtypes.client

import numbers

import array

import re

import ConfigParser

def getconnect(db_type=None,db_arg=None):

'''

sql server:

connector=pyodbc.connect('DRIVER={SQL SERVER};SERVER=LUOBO\SQLEXPRESS;DATABASE=chengguuo')

'''

if db_type in ('MSSQL','JET'):

try:

connector = pyodbc.connect(db_arg)

except :

logging.error("数据库连接错误!")

raise

return connector

def getdrawscript(f=None):

'''

如果给定文件名则打开该CAD文件。

如果没有给定文件名则认为待编辑的CAD文件已经打开。

'''

if not f:

try:

cad=comtypes.client.GetActiveObject('AutoCAD.Application') #这个可能有点问题

cad.Visible=False

drawingscript=cad.ActiveDocument

except :

logging.error("获得活动cad文件失败。请查看草稿文件是否已经打开,或请关闭除了草稿文件以外的所有cad文件。")

raise

else:

try:

cad=comtypes.client.CreateObject('AutoCAD.Application')

except :

logging.error("请确定本机上安装了autocad")

raise

try:

drawingscript=cad.Documents.Open(f)

except :

logging.error("cad文件打开失败。")

cad.Quit()

raise

return drawingscript

def getrows(sqlstring,connect=None,*args,**kargs):

'''

当返回大量记录时可以要占用大量内存空间

>>> sqlstring = 'SELECT SmX,SmY,name FROM SMDTV_93'

>>> connect = pyodbc.connect('DRIVER={SQL SERVER};SERVER=LUOBO\SQLEXPRESS;DATABASE=chengguuo')

>>> rows = getrows(sqlstring,connect)

>>> isinstance(rows,list)

True

>>> row=rows[1]

>>> isinstance(row[0],numbers.Real)

True

>>> isinstance(row[1],numbers.Real)

True

>>> isinstance(row[2],str)

True

'''

cursor=connect.cursor()

try:

cursor.execute(sqlstring)

rows = cursor.fetchall()

except :

logging.error("数据库进行sql查寻时出错")

raise

finally:

connect.close()

return rows # 返回引用,注意防止修改

def drawtext(x=None,y=None,text='什么都没有',draw=None,size=50):

'''

在cad里输入文字。

>>> drawtext(x=36395514.9324,y=3250445.33498,text=r'A1;T{H0.7x;S^3;}x',draw=getdrawscript('D:\Drawing11.dwg')) == 0

True

'''

if isinstance(x,numbers.Real) and isinstance(y,numbers.Real) and text: #无文字则不绘

point=array.array('d',[x,y,0])

try:

ms=draw.ModelSpace #draw必须没有关闭

#draw.ModelSpace.AddText(text,point,size) #单行文本

ms.AddMText(point,size,text) #多行文本

except:

logging.error("绘制文字出错!")

logging.error("nx:%sny:%sntext:%snpoint:%sndraw:%snms:s"%(x,y,text,point,draw,ms))

draw.Application.Quit()

raise

return 0

return 1

def removesharp(text):

'''

去掉text中的表示supermap标签专题图上下标的特殊符号

>>> removesharp("T#-3#=x")

'T3x'

>>> removesharp("J#-2#=S#+2")

'J2S2'

>>> removesharp("")

''

>>> removesharp(None)

''

'''

if text:

sharppattern=re.compile(r'#[+-=]')

modifiedtext=sharppattern.sub(r"",text,count=0)

else:

modifiedtext=""

return modifiedtext

def addchinesenote(test):

pass

def sharp2mtext(text):

'''

>>> text1 = 'T#-3#=x'

>>> text2 = 'J#-2#=S#+2'

>>> text3 = None

>>> sharp2mtext(text1) == '\A1;T{H0.7x;\\S^3;}x'

True

>>> #注意这是用的是repr()函数输出。

>>> print sharp2mtext(text1)

A1;T{H0.7x;\S^3;}x

>>> sharp2m

2000

text(text2) == '\A1;J{H0.7x;\S^2;}S{H0.7x;\S2^;}'

True

>>> sharp2mtext(text3) == ''

True

'''

if not text:

return ''

else:

ws=text.split('#')

logging.info(ws)

ws_conved=[]

for w in ws[1:]:

w_tem=''

if w[0] == '+':

w_tem = r'{H0.7x;S' + w[1:] + r'^;}'

elif w[0] == '-':

w_tem = r'{H0.7x;S^' + w[1:] + r';}'

elif w[0] == '=':

w_tem = w[1:]

ws_conved.append(w_tem)

text_conved = r'A1;'+ws[0]+''.join(ws_conved)

return text_conved

def main(*args,**kargs):

'''

>>> #main(filename="D:\Drawing1.dwg",sqlstring="SELECT SmX,SmY,name FROM SMDTV_93")

0

>>> # main(filename="D:\Drawing2.dwg",sqlstring="SELECT SmX,SmY,name FROM SMDTV_93") 失败,由于Drawing2.dwg还不存在

>>> # 0

>>> config = ConfigParser.ConfigParser()

>>> config.read('dot2text.cfg')

['dot2text.cfg']

>>> connectstring = config.get('APPLICATION','connectstring')

>>> connectstring='DRIVER={SQL SERVER};SERVER=LUOBO\SQLEXPRESS;DATABASE=chengguuo'

>>> filename = config.get('APPLICATION','outputfile')

>>> sqlstring = config.get('APPLICATION','sqlstring')

>>> dbtype =config.get('APPLICATION','dbtype')

>>> main(filename=filename,sqlstring=sqlstring,dbtype=dbtype,connectstring=connectstring)

0

'''

try:

filename=kargs['filename']

sqlstring=kargs['sqlstring']

dbtype=kargs['dbtype']

connectstring=kargs['connectstring']

except:

logging.info("请给出正确的关键字参数")

return 1

if not filename:

draw=getdrawscript()

else:

draw=getdrawscript(filename)

try:

layer=draw.Layers.Add("DOT_2_TEXT") #新增图层

draw.ActiveLayer=layer

except :

logging.error("添加新图层出错")

draw.Application.Quit()

raise

# 这里出过大bug,主要是异常的处理

#try:

# dbconnect=getconnect(db_type=dbtype,db_arg=connectstring)

#except:

# raise

#finally:

# draw.Application.Quit()

try:

dbconnect=getconnect(db_type=dbtype,db_arg=connectstring)

except:

draw.Application.Quit()

raise

try:

rows=getrows(sqlstring,dbconnect)

except:

return 1

try:

for row in rows:

#drawtext(x=row[0],y=row[1],text=removesharp(row[2]),draw=draw)

drawtext(x=row[0],y=row[1],text=sharp2mtext(row[2]),draw=draw)

draw.save()

except:

logging.error("主函数中的drawtext操作出错")

logging.error("drawtext:nrow[0]:%snrow[1]:%snrow[2]:%sn"%(row[0],row[1],row[2]))

return 1

draw.Application.Quit()

return 0

if __name__ == "__main__":

#filename = raw_input("请输入文件名n") # D:Drawing1.dwg

#sqlstring = raw_input("***请不要误操作!***n请输入查询语句。n") # select SmX,SmY,name from SMDTV93

config = ConfigParser.ConfigParser()

config.read('dot2text.cfg')

connectstring = config.get('APPLICATION','connectstring')

filename = config.get('APPLICATION','outputfile')

sqlstring = config.get('APPLICATION','sqlstring')

dbtype =config.get('APPLICATION','dbtype')

main(filename=filename,sqlstring=sqlstring,dbtype=dbtype,connectstring=connectstring)

[APPLICATION]

connectstring =DRIVER={SQL SERVER};SERVER=LUOBOSQLEXPRESS;DATABASE=chengguo

outputfile =D:Drawing1.dwg

dbtype =MSSQL

sqlstring =SELECT SmX,SmY,name from SMDTV_93

python mssql get image bin_python实现mssql里点数据集到AutoCAD的文本转换相关推荐

  1. python打开excel数据库_使用python导入excel文件中的mssql数据库数据

    我试图用python导入excel文件中的mssql数据库数据.我的数据在excel表格中的顺序不正确.e. g它显示第1列数据,然后是第3列,第2列,然后是第4列,依此类推. 我使用以下脚本:imp ...

  2. php连mssql 中文乱码,PHP连接MSSQL显示中文时为乱码_PHP教程

    PHP连接MSSQL显示中文时为乱码 PHP连接MSSQL显示中文时为乱码主要是因为编码问题了,我们只要懂得一对于数据库与页面的编码统一处理就可以解决了,下面一起来看看下文. 因为一直在使用 wind ...

  3. notepad怎么设置python为环境变量_在Notepad++里配置python环境

    1.首先在语言里选择Python 2.然后点击运行,在弹出的对话框里输入: cmd /k cd /d "$(CURRENT_DIRECTORY)" & python &qu ...

  4. python实现AES加解密文档里英文字符串

    python实现AES加解密文档里英文文章 AES加解密文档里英文字符串 英文文档中也包含了空格与回车符 加密过程 首先读取文件中的内容 将文档中的内容读取,然后将其赋予你申请的变量 在我的实验中我的 ...

  5. 用python统计王者荣耀里所有英雄的技能描述文本量并排序

    目标 对于我来说,学习新英雄的第一件事便是查看其技能描述.因此,我相信技能描述的文本量对于一个英雄的上手难度有着不小的影响. 因此,我希望能统计出王者荣耀里所有英雄的技能描述文本量,并对其排序,这样也 ...

  6. python唐诗分析综合_Python利器之胎教《唐诗三百首》文本分析

    事情是这样的,你们听我讲: 有一天,孕妈妈在家庭群里对准爸爸说,在某猫上买本<唐诗三百首>吧,每天给宝宝读一首唐诗,作为胎教.有图有真相: 作为好吃懒做的准爸爸,听到这个消息的瞬间,表情是 ...

  7. 【Python自然语言处理】读书笔记:第三章:处理原始文本

    本章原文链接:https://usyiyi.github.io/nlp-py-2e-zh/3.html 3 处理原始文本 import nltk, re, pprint from nltk impor ...

  8. 深度学习入门-基于Python的理论入门与实现源代码加mnist数据集下载推荐

    深度学习入门-基于Python的理论入门与实现源代码加mnist数据集下载推荐 书籍封面 1-图灵网站下载 书里也说了,可以图灵网站下载https://www.ituring.com.cn/book/ ...

  9. python字典(dict)+常用方法操作+列表、元组、集合、字典的互相转换

    python字典(dict)+常用方法操作+列表.元组.集合.字典的互相转换 字典也是 Python 提供的一种常用的数据结构,它用于存放具有映射关系的数据. 为了保存具有映射关系的数据,Python ...

  10. python数据挖掘课程】二十一.朴素贝叶斯分类器详解及中文文本舆情分析

    #2018-04-06 13:52:30 April Friday the 14 week, the 096 day SZ SSMR python数据挖掘课程]二十一.朴素贝叶斯分类器详解及中文文本舆 ...

最新文章

  1. linkedlist(c语言_简单实现)
  2. 如何更改计算机性能,如何修改注册表优化电脑性能 修改注册表优化电脑性能方法...
  3. iphone开机白苹果_摔过的iPhone,手机不开机、白苹果、听筒无声,多重问题一次搞定...
  4. 转:asp.net 负载平衡-Session相关
  5. 修改so_货代、海运操作、船务操作还分不清?船公司SO文件看不懂?
  6. 停止坐井观天,是时候让“我个人认为”见鬼去了!
  7. Memcached未授权访问漏洞记录(CVE-2013-7239、危害级别全版本、端口:11211)
  8. window下用主机名登录MySQL数据库出现报错解决方案
  9. PLSQL中文显示乱码
  10. 辩证的看DIV+CSS与TABLE
  11. 二重指针、二维数组及二者如何进行赋值
  12. Spring源码之bean的属性填充populateBean方法解读
  13. 数学建模系列--灰色关联分析
  14. 局域网内两台电脑无法共享文件问题
  15. 2018,我的这一年
  16. Pycharm 更换皮肤和壁纸
  17. 一个可用来记录Isilon各个节点的CPU,网络,磁盘性能的命令
  18. 还在谈论云计算吗?算力网络来啦!!!
  19. 动物miRNA靶基因本地预测(三)—— 靶基因预测与结果分析
  20. C - C语言实验——一元二次方程Ⅰ

热门文章

  1. OAuth认证实现机制及单点登录原理
  2. 说话人识别ALIZE工具包的编译
  3. 爱加密脱壳(持续更新)
  4. 遗传算法框架deap简介与使用
  5. 无线WIFI短信认证平台(互亿无线)
  6. 单干必备:论嵌入式模块化编程、驱动分离的重要性
  7. 小米全系列机型代码查询与 制作rom分区架构图示
  8. Qt线程:QThread
  9. redis在php下面的命令大全
  10. 140个电脑小知识、小技巧