আরকপ্যাপের মাধ্যমে চেক করা যদি আর্কম্যাপ সম্পাদনা সেশনে থাকে?


11

আমি একটি পাইথন অ্যাড-ইন বোতাম তৈরি করেছি যা আমার সহকর্মীদের কর্মপ্রবাহকে আরও একটি বৈশিষ্ট্য শ্রেণীর অ্যাট্রিবিউট অনুলিপি করে গতিতে সহায়তা করে। এটি লক্ষ্য বৈশিষ্ট্য শ্রেণীর একটি সারি আপডেট করার জন্য আরকিপি.অপ্যাটেট কার্সার ফাংশনটি ব্যবহার করে। বর্তমানে এটি বিদ্যমান হিসাবে, এই বোতাম স্ক্রিপ্টটি সম্পাদনা মোড নির্বিশেষে চালানো যেতে পারে। স্পষ্টতই যখন এটি সম্পাদনা অধিবেশনটিতে চলে আসে তখন ব্যবহারকারী সম্পাদনা বন্ধ করতে এবং পরিবর্তনগুলি সংরক্ষণ না করে বেছে নিতে পারে, তবে স্ক্রিপ্টটি সম্পাদনা সেশনের বাইরে চলে গেলে এমনটি হয় না।

স্ক্রিপ্টটিতে আমি কীভাবে এমন একটি চেক যোগ করতে পারি যা স্ক্রিপ্টটি চালানো থেকে আটকাতে পারে যদি আরকম্যাপ বর্তমানে সম্পাদনা সেশনে না থাকে?

এটি আর্কম্যাপ 10 এবং 10.1 নিয়ে উদ্বেগ প্রকাশ করে


আমি অন্যান্য আর্কম্যাপ ব্যবহারকারীদের সাথে এটিও যাচাই করতে চাই যে সাধারণভাবে সম্পাদনা সেশনে না থাকলে টেবিলগুলিতে আপডেটের অনুমতি দেওয়া হয় না।

তাহলে এই স্ক্রিপ্টটি সম্পাদনা সেশনের বাইরে কীভাবে চলছে?

এই স্ক্রিপ্টটি আপাতদৃষ্টিতে নির্মমভাবে নির্বাচন সংক্রান্ত অর্ডার ম্যাপ সম্পর্কে আরও একটি প্রশ্ন উত্থাপন করে, যখন আমি তালিকা থেকে ২ য় বৈশিষ্ট্য শ্রেণীর টেবিলটি আপডেট করি তখন কেবল আমার জন্য কাজ হয়, তবে তা অন্য দিনের জন্য।

স্ক্রিপ্টটি এখন যেমন কাজ করে চলেছে (কোনও 10.1 সম্পাদক বাস্তবায়ন ছাড়াই):

ব্যবহারকারী কোনও সম্পাদনা সেশনে আছেন কিনা তা নিশ্চিত করতে একটি চেক যুক্ত করবেন কীভাবে?

def onClick(self):
    #Reference mxd
    mxd = arcpy.mapping.MapDocument("CURRENT")
    #Reference the main Data frame
    mm = arcpy.mapping.ListDataFrames(mxd, "MainMap")[0]
    #Reference the Water System Valve feature class
    waterValves = arcpy.mapping.ListLayers(mxd, "Water System Valve", mm)[0]
    #Reference the fire hydrant feature class
    fireHydrants = arcpy.mapping.ListLayers(mxd, "Water Hydrant", mm)[0]

    #Use the extent of the main DF to select all valves in the current view
    dfAsFeature = arcpy.Polygon(arcpy.Array([mm.extent.lowerLeft, mm.extent.lowerRight, mm.extent.upperRight, mm.extent.upperLeft]), mm.spatialReference)
    arcpy.SelectLayerByLocation_management(waterValves, "WITHIN", dfAsFeature,"", "NEW_SELECTION")

    arcpy.SelectLayerByAttribute_management(waterValves, "SUBSET_SELECTION", "LOCATIONID IS NULL")

    fields = ["LOCATIONID"]

    row, rows = None, None
    rows = arcpy.UpdateCursor(waterValves,fields)
    row = rows.next()
    valveList = []
    append = valveList.append

    #Loop through the valves table to update LocationID
    while row:
        builder = str(row.QSNO)+"-"+ str(row.VALVESEQNO)
        row.setValue("LOCATIONID", builder)
        append(builder)
        rows.updateRow(row)
        row = rows.next()

    del row, rows

    #New selection for fire hydrants
    arcpy.SelectLayerByLocation_management(fireHydrants, "WITHIN", dfAsFeature,"", "NEW_SELECTION")
    arcpy.SelectLayerByAttribute_management(fireHydrants, "SUBSET_SELECTION", "LOCATIONID IS NULL")

    row, rows = None, None
    rows = arcpy.UpdateCursor(fireHydrants,fields)
    row = rows.next()

    #Loop through fire hydrant table to update LocationID
    while row:
        for locID in valveList:
            construct = str(locID) + "-FH"
            #print construct
            row.setValue("LOCATIONID", construct)
            rows.updateRow(row)
            row = rows.next()

    del row, rows, valveList, mxd

ডেটা অ্যাক্সেস মডিউল সম্পাদক মানক সম্পাদক থেকে স্বতন্ত্রভাবে চালিত বলে মনে হচ্ছে। সক্রিয় সম্পাদনা সেশনের জন্য পরীক্ষার বিষয়ে আমি কোনও অতিরিক্ত ধারণা স্বাগত জানাব। -কার্ল
কার্লজায়ার

আপনি কি আরও কিছু তথ্য সরবরাহ করতে পারেন? আমাদের মধ্যে যারা মডিউলটি অন্বেষণ করেনি তাদের জন্য কী এই সিদ্ধান্তে পৌঁছেছে?
জে লৌরা

উত্তর:


6

এই পোস্টের উপর ভিত্তি করে এখানে একটি জেনেরিক ফাংশন।

এটি আরকোবজেক্টস সমাধানের চেয়ে কিছুটা বেশি ক্লডজি তবে এটি অবশ্যই অনেক কম ঝামেলার মতো মনে হচ্ছে! সহজ জটিল চেয়ে ভাল। বাদে যখন তা না হয়।

ব্যবহারের উদাহরণ:

if CheckEditSession(tbl):
    print("An edit session is currently open.")

কোড:

def CheckEditSession(lyr):
    """Check for an active edit session on an fc or table.
    Return True of edit session active, else False"""
    edit_session = True
    row1 = None
    try:
        # attempt to open two cursors on the input
        # this generates a RuntimeError if no edit session is active
        OID = arcpy.Describe(lyr).OIDFieldName
        with arcpy.da.UpdateCursor(lyr, OID) as rows:
            row = next(rows)
            with arcpy.da.UpdateCursor(lyr, OID) as rows2:
                row2 = next(rows2)
    except RuntimeError as e:
        if e.message == "workspace already in transaction mode":
            # this error means that no edit session is active
            edit_session = False
        else:
            # we have some other error going on, report it
            raise
    return edit_session

+1 সুন্দর ধারণা, তবে ওপি সম্পাদনা সেশনে না থাকলে থামাতে চায় এবং এটি সম্পাদনা সেশনে থাকলে চালিয়ে যেতে চায়। আপনার উত্তরটি বিপরীতে উপস্থিত বলে মনে হচ্ছে। সম্ভবত এটি ঘুরিয়ে নিতে খুব বেশি সময় লাগবে না।
মিডাভালো

ওপি ইতিমধ্যে তার সমস্যার সমাধান করেছে, এই পোস্টটি আরও সাধারণভাবে কার্যকর কার্যক্রমে কেবল আইসিং করছে। ফাংশনটি কীভাবে ব্যবহৃত হয় তা সম্পর্কে আরও পরিষ্কার হতে আমি আমার উদাহরণটি পরিবর্তন করেছি।
কার্টিস দাম

4

আরকিপি অ্যাডিন সরঞ্জামদণ্ডের জন্য উপলব্ধ এক্সটেনশনগুলি ব্যবহার করা এই সমস্যার আমার সমাধান ছিল। আমি একটি এক্সটেনশন যুক্ত করেছি যা সম্পাদনা অধিবেশন শুরু বা শেষ হতে শোনে। আমার বারে আমার সমস্ত বোতাম সেট আছে: নিজেই শুরু করুন = মিথ্যা "দিয়ে শুরু করুন এবং তারপরে এই বোতামগুলি হয় সম্পাদনা সেশন শুরু করে বা বন্ধ করে দ্বারা সক্ষম বা অক্ষম করা হয়।

class Active_Edit_Session(object):
"""Implementation for NEZ_EDITS_addin.Listen_for_Edit_Session (Extension)"""
def __init__(self):
    self.enabled = True
def onStartEditing(self):
    button_3100.enabled=True    
def onStopEditing(self, save_changes):
    button_3100.enabled=False

class LFM_3100(object):
    """Implementation for LFM_3100.button_3100 (Button)"""
    def __init__(self):
        self.enabled = False
        self.checked = False
    def onClick(self):
        ......

এটি চেষ্টা করার মতো সমাধানের মতো মনে হচ্ছে। আপনাকে ধন্যবাদ
ব্যবহারকারী 18412

4

আমি আর একটি উত্তর পোস্ট করছি কারণ আমি আরকব্যাপ এবং পাইথনকে একসাথে ব্যবহার করে আরকম্যাপে সম্পাদকের স্থিতি পরীক্ষা করার জন্য একটি নতুন পদ্ধতি শিখেছি। আমার উত্তরটি মার্ক সিডারহোলমের করা পোস্ট থেকে এই পোস্টে উল্লেখ করা কাজ থেকে প্রচুর ?ণ নিয়েছে : আমি পাইথন থেকে আরকঅবজেক্টগুলি কীভাবে অ্যাক্সেস করব? , এবং ম্যাট উইলকি তার "স্নিপিটস.পি" ফাইলটিতে সরবরাহ করেছেন কোড উদাহরণ। কমপি টাইপ ডাউনলোড এবং ইনস্টল করার জন্য আপনাকে প্রথম উত্তরে প্রদত্ত নির্দেশাবলী অনুসরণ করতে হবে এবং তারপরে স্নিপেটস.পি স্ক্রিপ্টের একটি অনুলিপি পেতে হবে। আমি নীচে সেই স্ক্রিপ্ট থেকে প্রয়োজনীয় ফাংশনগুলির একটি অনুলিপি পোস্ট করছি।

যখন আর্কম্যাপ_গেটএডিটসেশনস্ট্যাটাস () ফাংশনটি বলা হয়, এটি আরকম্যাপে সম্পাদকের বর্তমান অবস্থা পরীক্ষা করে সত্য বা মিথ্যা ফিরে আসবে। এটি আমাকে পরীক্ষা করতে দেয় যে কোনও ব্যবহারকারী আমার সরঞ্জামটি ব্যবহার করতে প্রস্তুত কিনা বা তাদের সম্পাদনা সেশন শুরু করার অনুরোধ জানানো উচিত। পাইকনটিতে আরকোবজেক্টগুলি ব্যবহারের আগে কমপিপগুলি ইনস্টল করার জন্য এই পদ্ধতির ক্ষতিটি হ'ল প্রয়োজনীয়তা, সুতরাং মাল্টি-ইউজার অফিস পরিবেশে এই প্যাকেজটির প্রয়োজন এমন একটি সরঞ্জাম ভাগ করে নেওয়া সম্ভব নাও হতে পারে। আমার সীমিত অভিজ্ঞতার সাথে আমি নিশ্চিত না যে কীভাবে এএসরি পাইথন সরঞ্জাম অ্যাড-ইন হিসাবে সহজে ভাগ করে নেওয়ার জন্য এটি সমস্ত একসাথে বান্ডেল করা যায়। এটি কীভাবে করবেন তার পরামর্শগুলি প্রশংসা হবে।

#From the Snippits.py file created by Matt Wilkie
def NewObj(MyClass, MyInterface):
    """Creates a new comtypes POINTER object where\n\
    MyClass is the class to be instantiated,\n\
    MyInterface is the interface to be assigned"""
    from comtypes.client import CreateObject
    try:
        ptr = CreateObject(MyClass, interface=MyInterface)
        return ptr
    except:
        return None

def CType(obj, interface):
    """Casts obj to interface and returns comtypes POINTER or None"""
    try:
        newobj = obj.QueryInterface(interface)
        return newobj
    except:
        return None

def CLSID(MyClass):
    """Return CLSID of MyClass as string"""
    return str(MyClass._reg_clsid_)

def GetApp(app="ArcMap"):
    """app must be 'ArcMap' (default) or 'ArcCatalog'\n\
    Execute GetDesktopModules() first"""
    if not (app == "ArcMap" or app == "ArcCatalog"):
        print "app must be 'ArcMap' or 'ArcCatalog'"
        return None
    import comtypes.gen.esriFramework as esriFramework
    import comtypes.gen.esriArcMapUI as esriArcMapUI
    import comtypes.gen.esriCatalogUI as esriCatalogUI
    pAppROT = NewObj(esriFramework.AppROT, esriFramework.IAppROT)
    iCount = pAppROT.Count
    if iCount == 0:
        return None
    for i in range(iCount):
        pApp = pAppROT.Item(i)
        if app == "ArcCatalog":
            if CType(pApp, esriCatalogUI.IGxApplication):
                return pApp
            continue
        if CType(pApp, esriArcMapUI.IMxApplication):
            return pApp
    return None


def GetModule(sModuleName):
    """Import ArcGIS module"""
    from comtypes.client import GetModule
    sLibPath = GetLibPath()
    GetModule(sLibPath + sModuleName)


def GetDesktopModules():
    """Import basic ArcGIS Desktop libraries"""
    GetModule("esriFramework.olb")
    GetModule("esriArcMapUI.olb")

#My added function for checking edit session status
def ArcMap_GetEditSessionStatus():

    GetDesktopModules()
    GetModule("esriEditor.olb")
    import comtypes.gen.esriSystem as esriSystem
    import comtypes.gen.esriEditor as esriEditor
    pApp = GetApp()
    pID = NewObj(esriSystem.UID, esriSystem.IUID)
    pID.Value = CLSID(esriEditor.Editor)
    pExt = pApp.FindExtensionByCLSID(pID)
    pEditor = CType(pExt, esriEditor.IEditor)
    if pEditor.EditState == esriEditor.esriStateEditing:
        print "Edit session active"
        return True
    else:
        print "Not in an edit session"
        return False

1
এটি দুর্দান্ত কাজ করে। আমি জানি এটি একটি পুরানো পোস্ট, তবে আপনি যদি এটি প্যাকেজ করতে চান তবে এটি আরও পোর্টেবল হয়, আপনি স্নিপেটস মডিউলটিকে একটি পাইথন প্যাকেজ হিসাবে তৈরি করতে পারেন এবং এর মধ্যে কমপিগুলি অন্তর্ভুক্ত করতে পারেন। আমি আমার সংস্থার পক্ষে এটি করি এবং আমি আমাদের সমস্ত কাস্টম পাইথন মডিউল একটি নেটওয়ার্ক শেয়ারে রেখেছি। যতবারই কেউ আর্কজিআইএস সফ্টওয়্যার ইনস্টল / পুনরায় ইনস্টল করেন, আমার কাছে তাদের একটি ব্যাচ ফাইল চালানো হয়েছে যা তাদের Desktop.pthনেটওয়ার্ককে ভাগ করে নেওয়ার পুরো পথ অন্তর্ভুক্ত করার জন্য তাদের ফাইলকে পরিবর্তন করে , যাতে প্রত্যেকে স্বয়ংক্রিয়ভাবে সবকিছু আমদানি করতে পারে।
ক্র্যামাকি

2

কিভাবে ডেটা অ্যাক্সেস মডিউল ব্যবহার সম্পর্কে ? দেখে মনে হচ্ছে আপনি এই মডিউলটি দিয়ে একটি সম্পাদনা সেশন শুরু করতে পারেন।

কয়েকটি সতর্কতা:

  1. আমি এই মডিউলটি চেষ্টা করে দেখিনি এবং এটি 10.0 সামঞ্জস্যপূর্ণ কিনা তা আমি নিশ্চিত নই। (10.1 এ নতুন?)
  2. উদাহরণ 1 একটি withবিবৃতি ব্যবহার দেখায় । এটি বাস্তবায়নের জন্য এটি একটি দুর্দান্ত দৃষ্টান্ত কারণ এটি সম্ভাব্য ব্যতিক্রমগুলি ভালভাবে পরিচালনা করে।
  3. কোনও try / exceptবিবৃতিতে একটি চালু করার চেষ্টা করে যদি সম্পাদনা সেশন ইতিমধ্যে লাইভ থাকে তবে আপনি পরীক্ষা করতে সক্ষম হতে পারেন ।

আমি যখন এই প্রকল্পটি শুরু করি তখন ডেটা অ্যাক্সেস মডিউলটিতে সম্পাদক শ্রেণিটি ব্যবহার করে আমি আসলে শুরু করেছিলাম তবে এটি ব্যবহার করার বিষয়টি মনে হয় না। "আরকিপি.ডি.এডিটর (ওয়ার্কস্পেস) সহ সম্পাদনা হিসাবে অন্তর্ভুক্ত করা:" আমার স্ক্রিপ্টে সম্পাদকটি সক্রিয় করেনি, এবং স্টপঅপারেশন / স্টপ চেষ্টা করে। সম্পাদনাটি সম্পাদককে থামেনি। তবে আমি এটি ভুল হতে পারি ...
ব্যবহারকারীর 18412

1

সুতরাং আমার সরঞ্জামটি ব্যবহার করা কেউ সম্পাদনার অধিবেশন এ থাকলে বা নিয়ন্ত্রণ করতে না পারার বিষয়টি আমি এইভাবে ঠিক করেছি:

#Reference to mxd and layers script here. Then...
try:
    fields = ("OBJECTID")
    upCursor = arcpy.da.UpdateCursor(waterValves, fields)
    with upCursor as cursor:
        for row in cursor:
            pass
except:
    pythonaddins.MessageBox('You are not in an edit session', 'Warning', 0)

else:
#Rest of script

স্ক্রিপ্টটি কাজ করে কারণ এটি স্ক্রিপ্টের পরে আরও একটি আপডেটকার্সার রয়েছে এমন একটি স্তরে একটি আপডেট কার্সার তৈরি করার চেষ্টা করে। এটি ডেটা অ্যাক্সেস মডিউলটির আচরণ লঙ্ঘন করে। আরসিপি.ডি.এ.পি. আপডেট সংস্করণে ইএসআরআই সংস্থান পৃষ্ঠা অনুসারে:

"বিভিন্ন কার্সার ব্যবহার করে একই ওয়ার্কস্পেসে যুগপত সন্নিবেশ এবং / অথবা আপডেট ক্রিয়াকলাপগুলি সম্পাদনা অধিবেশন শুরুর প্রয়োজন" "

আমি এই সমাধানটি নিয়ে সন্তুষ্ট নই কারণ এটি যে ধারণা আমি সঠিক আরকি স্ক্রিপ্টিং এর চেয়ে বেশি হ্যাক। ভাল ধারণা কেউ?


1
এটি কেবল একটি ধারণা তবে আপনি আরকোবজেক্টস-এ সম্পাদক অবজেক্টে অ্যাক্সেস করার চেষ্টা করতে পারেন এবং এর সম্পত্তি এডিটস্টেটটি যা পরীক্ষা করে দেখতে পেয়েছেন যে আরকি থেকে পাওয়া যাচ্ছে না? অজগর থেকে আমি আরকোবজেক্টগুলি কখনই হেরফের করার চেষ্টা করি নি তবে এই থ্রেডটি এটি কীভাবে করবেন তা নিয়ে আলোচনা করে?
হর্নবিড্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.